二叉树的遍历
先序遍历
遍历过程为
1)访问根结点
2)先序遍历其左子树
3)先序遍历其右子树
void PreOrderTraversal (BinTree BT)
{
if(BT)
{
printf("%d", BT->Data);
PreOrderTraversal( BT->Left);
PreOrderTraversal( BT->Right);
}
}
中序遍历
遍历过程为
1)中序遍历其左子树
2)访问根结点
3)中序遍历其右子树
void InOrderTraversal (BinTree BT)
{
if(BT)
{
InOrderTraversal(BT->Left);
printf("%d", BT->Data);
InOrderTraversal(BT->Right);
}
}
后序遍历
遍历过程为
1)后序遍历其左子树
2)后序遍历其右子树
3)访问根节点
void PostOrderTraversal( BinTree BT)
{
if(BT)
{
PostOrderTraversal(BT->Left);
PostOrderTraversal(BT->Right);
pinrtf("%d",BT->Data);
}
}
先序、中序和后序遍历过程:遍历过程中经过结点的路线一样,只是访问各结点的时机不同
中序遍历非递归遍历算法
遇到一个结点,就把它压栈,并去遍历它的左子树
当左子树遍历结束后,从栈顶弹出这个结点并访问它
然后按其右指针再去中序遍历该结点的右子树
void InOrderTraversal( BinTree BT)
{
BinTree T=BT;
Stack S = CreatStack(MaxSize);
while ( T || !IsEmpty(s))
{
while(T)
{
Push(S,T);
T = T->Left;
}
if(!IsEmpty(s))
{
T = Pop(S);
printf("%5d", T->Data);
T = T->Right;
}
}
}
层序遍历
队列实现:遍历从根结点开始,首先将根结点入队,然后开始执行循环:结点出队、访问该结点、其左右儿子入队
层序遍历基本过程:
先根结点入队,然后:
1)从队列中取出一个元素
2)访问该元素所指结点
3)若该元素所指结点的左、右孩子结点非空,则将其左、右孩子的指针顺序入队
void LevelOrderTraversal(BinTree BT)
{
Queue Q; BinTree T;
if(!BT)
return ;
Q = CreatQueue(MaxSize);
Add( Q,BT );
while(!IsEmptyQ( Q ))
{
T = DeleteQ( Q );
printf("%d\n",T->Data);
if(T->Left) AddQ( Q, T->Left);
if(T->Right) AddQ( Q, T->Right);
}
}