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