递归遍历
1.先序遍历
过程
① 访问根结点
② 先序遍历左子树
③ 先序遍历右子树
void PreOrdeTraversal( BinTree BT){
if(BT){
printf("%d", BT->Data);
PreOrdeTraversal(BT->Left);
PreOrdeTraversal(BT->Right);
}
}
2.后序遍历
void PreOrdeTraversal( BinTree BT){
if(BT){
PreOrdeTraversal(BT->Left);
PreOrdeTraversal(BT->Right);
printf("%d", BT->Data);
}
}
3.中序遍历
void PreOrdeTraversal( BinTree BT){
if(BT){
PreOrdeTraversal(BT->Left);
printf("%d", BT->Data);
PreOrdeTraversal(BT->Right);
}
}
中序遍历非递归遍历算法
非递归基本思路 : 使用堆栈
·遇到一个节点,就把它压栈,并去遍历它的左子树
·当左子树遍历结束后,从栈顶弹出这个节点并访问它
·然后按其右指针再去中序遍历该节点的右子树
void PreOrdeTraversal(BinTree Bt){
BinTree T=BT;
Stack s = CreatStack (MaxSize) // 创建并初始化堆栈 s
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 LeveOrderTraversal (BinTree BT){
Queue Q; BinTree T;
if(!BT) return ; // 空树直接返回
Q = CreatQueue (MaxSize); // 创建并初始化队列
AddQ(Q, BT);
while(!IsEmptyQ(Q)){
T = DeleteQ(Q);
printf("%d\n",T -> Left); //访问取出队列的节点
if(T -> Left) AddQ(Q, T -> Left);
if(T -> Right) AddQ(Q, T -> Right);
}
}
由两种遍历序列确定二叉树
必须有 中序遍历
先序遍历的第一个数是根结点 对应的在中序遍历中找出, 然后再从中序遍历的左子树中找到左子树的根结点
后序遍历的最后一个数是根结点,对应的在中序遍历中找出