二叉數的遞歸遍歷及基本操作

數據結構   二叉數的建立與遍歷

遞歸方式遍歷及基本操作


 

#include<stdio.h>
#include<malloc.h>
#define OVERFLOW 0;
#define ERROR O;
#define OK 1;
typedef char TElemType;
typedef int Status;
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
Status CreateBiTree(BiTree &T)
{
	char ch;
	fflush(stdin); 
	scanf("%c",&ch); 
	fflush(stdin); 
	if(ch==' ')T=NULL;
	else{		
		if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))return OVERFLOW;
		T->data=ch;
		printf("請輸入 %c 的左節點:\n",T->data);
		CreateBiTree(T->lchild);
		printf("請輸入 %c 的右節點:\n",T->data);
		CreateBiTree(T->rchild);
	}
}
Status PreOrderTraver(BiTree T,Status(*Visit)(TElemType))//先序遍歷 
{
	 if(T)
	 {
		  Visit(T->data);
		  PreOrderTraver(T->lchild,Visit);
		  PreOrderTraver(T->rchild,Visit);
	 }
}
Status InOrderTraverse(BiTree &T,Status(*Visit)(TElemType))//中序遍歷 
{
	 if(T)
	 {
		  InOrderTraverse(T->lchild,Visit);
		  Visit(T->data);
		  InOrderTraverse(T->rchild,Visit); 
	 }
}
Status PostOrderTraverse(BiTree T,Status(*Visit)(TElemType))//後序遍歷 
{
	 if(T)
	 {
        PostOrderTraverse(T->lchild,Visit);
        PostOrderTraverse(T->rchild,Visit);
        Visit(T->data);
	 }
}
//求葉子數
int leafCount(BiTree T)
{
	int count1,count2;
	if(T==NULL)
		return 0;
	else
	{
		if(T->lchild==NULL&&T->rchild==NULL)
			return 1;
		else
		{
			count1=leafCount(T->lchild);
			count2=leafCount(T->rchild);
			return count1+count2;
		}
	}
}
//***********************************************************************
//求二叉樹每層節點的個數,保存到數組num中
void levelCount(BiTree T,int l,int num[])
{
	if(T)
	{
		num[l]++;
		levelCount(T->lchild,l+1,num);
		levelCount(T->rchild,l+1,num);
	}
}
//***********************************************************************
//求二叉樹的高度
Status heightTree(BiTree T)
{
	int h1,h2;
	if(T==NULL)
		return 0;
	else
	{
		h1=heightTree(T->lchild);
		h2=heightTree(T->rchild);
		if(h1>h2)return h1+1;
		else return h2+1;
	}
}
Status PrintElement(TElemType e)
{
	printf("%c ",e);
	return OK;
}
int main()
{
	BiTree T;
	printf("請輸入樹根:\n"); 
	CreateBiTree(T);
	printf("先序遍歷:\n");
	PreOrderTraver(T,PrintElement);
	printf("\n中序遍歷:\n");
	InOrderTraverse(T,PrintElement);
	printf("\n後序遍歷:\n");
	PostOrderTraverse(T,PrintElement);
	printf("\n該樹的深度是:%d \n",heightTree(T));
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章