3.4 二叉树的遍历
有四种方法:先序、中序、后序和层次遍历。
用链式存储结构:
typedef struct TreeNode *Position;
typedef Position BinTree;
struct TreeNode{
Element Data;
BinTree Left,Right;
};
先序遍历
先访问根结点,再遍历左子树、右子树。
void PreOrderTraversal(BinTree BT){
if(BT)
{
printf("%d",BT->Data);
PreOrderTraversal(BT->Left);
PreOrderTraversal(BT->Right);
}
}
中序遍历
先遍历左子树,再访问根结点、遍历右子树。
递归法:
void InOrderTraversal(BinTree BT){
if(BT)
{
PreOrderTraversal(BT->Left);
printf("%d",BT->Data);
PreOrderTraversal(BT->Right);
}
}
非递归法:
- 从根结点开始向左压入堆栈
- 从堆栈中弹出一个结点,输出该结点
- 继续中序遍历右子树
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;/*转向右结点*/
}
}
}
后序遍历
先遍历左子树,再遍历右子树、访问根结点。
void PostOrderTraversal(BinTree BT){
if(BT)
{
PreOrderTraversal(BT->Left);
PreOrderTraversal(BT->Right);
printf("%d",BT->Data);
}
}
层次遍历
- 根结点入队
- 循环中实现:
- 输出根结点
- 左结点入队
- 右结点入队
void LevelOrderTraversal(BinTree BT){
BinTree T;
if(!BT)
return ;
Queue Q=CreatQueue(MaxSize);
AddQ(Q,BT);//根结点入队
while(!IsEmptyQ(Q)){
T=DeleteQ(Q);//根结点出队
printf("%5d",T->Data);//访问根结点
if(T->Left)
AddQ(Q,T->Left);//左结点入队
if(BT->Right)
AddQ(Q,T->Right);//右结点入队
}
}