最近在mooc上看到浙大数据结构课,对于二叉树的讲解很详细,我就来总结一下我的学习笔记
1.先序遍历递归
2.中序遍历递归
3.后序遍历递归
按照叉号读出来的顺序是前序遍历,正好是第一次经过该节点
按照星号读出来的顺序是中序遍历,正好是第二次经过该节点
按照三角形读出来的顺序是后序遍历,正好是第三次经过该节点
按照第1、2、3次经过该节点读出来的顺序就是二叉树的 前、中、后 遍历了,且每个节点被经过了3次,这样的话,我们实现非递归遍历的话,就只要在合适的时机把数据输出,这里我们利用堆栈
1.先序遍历的非递归遍历算法
void InOrderTraversal(BinTree BT)
{
BinTree T BT;
stack S=CreatStack(Maxsize);/*创建并初始化堆栈S*/
while(T ||!IsEmpty(S))
{
while(T)/*一直向左并将沿途结点压入堆栈*/
{
printf("%5d",T->Data);/*(访问)打印结点*/
Push(S,T);
T=T->Left;
}
if(!IsEmpty(S))
{
T=Pop(S);/*结点弹出堆栈*/
T=T->Right;/*转向右子树*/
}
}
}
2.中序遍历非递归遍历算法
遇到一个结点,就把它压栈,并去遍历它的左子树;
当左子树遍历结束后,从栈顶弹出这个结点并访问它;
然后按其右指针再去中序遍历该结点的右子树。
void InOrderTraversal(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;/*转向右子树*/
}
}
}
3.后序遍历的非递归遍历算法
void InOrderTraversal(BinTree BT)
{
while(T|| !IsEmpty(S))
{
while(T)
{
push(S,T);
T=T->Left;
}
if(IsEmpty(s))
{
T=pop(S,T); /*这个POP有着第二次和第三次遇到两个功能,如果是最左边的节点,就不用等到第三次遇到再输出,或者说第三次和第二次遇到是一起的*/
if(T->Right && T->Right != Temp)/*如果该节点还有右子树,并且和上一次经历的右边节点不同,就转向右边,同时刚刚POP出来的节点重新入栈。*/
{
push(S,T);
T=T->Right;
Temp=T;/*储存已经走过的右边节点*/
}
else
{
printf("%5d",T->Data);
T=NULL;
}
}
}
}