二叉树的遍历
二叉树的性质:
性质一:在二叉树的第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");
}
运行实例:


浙公网安备 33010602011771号