二叉树的遍历

二叉树的性质:

性质一:在二叉树的第i 层上至多有2^(i-1)个结点(i>=1)。

性质二:深度为K的二叉树至多有2^k-1 个结点(k>=1)。

性质三:对任何一颗二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则 n0=n2+1。

性质四:具有n个结点的完全二叉树的深度为[log2(n)]+1。

性质五:如果对一棵有n个结点的完全二叉树的结点按层序编号,则对任意结点i,有
      (1)如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲PARENT(i)=[i/2]。
      (2)如果2i>n,则结点i无左孩子;否则其左孩子LCHILD(i)=2i。
      (3)如果2i+1>n,则结点i无右孩子;否则其右孩子RCHILD(i)=2i+1。

 

链式存储结构定义:

typedef struct BitNode
{
	int data;
	struct BitNode *lchild, *rchild;
}BitNode,*BiTree;

  

先序序列构造二叉树:

void creatBiTree(BiTree *T)  //注意理解此处的BiTree *T
{
	int num;
	scanf("%d", &num);
	if (num == 0)      //当num==0时表示结点没有左孩子或右孩子或者左右孩子,也是递归的出口条件
	{
		*T = NULL;
		return;
	}

	*T = (BiTree)malloc(sizeof(BitNode));
	(*T)->data = num;
	creatBiTree(&(*T)->lchild);
	creatBiTree(&(*T)->rchild);
		

}

  

先序遍历二叉树:

void PreOrderTraverse(BiTree T)
{
	if (!T)
		return;
	printf("%d", T->data);
	PreOrderTraverse(T->lchild);
	PreOrderTraverse(T->rchild);

}

  

中序遍历二叉树:

void InOrderTraverse(BiTree T)
{
	if (!T)
		return;
	InOrderTraverse(T->lchild);
	printf("%d", T->data);
	InOrderTraverse(T->rchild);

}

  

后序遍历二叉树:

void PostOrderTraverse(BiTree T)
{
	if (!T)
		return;
	PostOrderTraverse(T->lchild);
	PostOrderTraverse(T->rchild);
	printf("%d", T->data);

}

  

主函数:

int main()
{
	BiTree t;
	
        creatBiTree(&t);
	
	printf("先序遍历二叉树:");
	PreOrderTraverse(t);
	printf("\n");
	printf("中序遍历二叉树:");
	InOrderTraverse(t);
	printf("\n");
	printf("后序遍历二叉树:");
	PostOrderTraverse(t);
	printf("\n");
}

  

运行实例:

posted @ 2017-09-18 14:21  LULU酱  阅读(154)  评论(0编辑  收藏  举报