二叉树的遍历的非递归实现

时间:2021-06-04 10:25:17

采用堆栈实现

1.先序遍历

void InOrderTraversal(BinTree BT)
{
BinTree T=BT;
Stack S=CreatStack(MaxSize);
while(T || !IsEmpty(S))
{
while(T)//T存在就压栈,遍历其左子树
{
Push(S,T);
T=T->Left;
}
if(!IsEmpty(S))//压入的全部弹出来
{
T=Pop(S);
printf("%d\n",T->Data);
T=T->Right;//最后将T变成了T的右子节点
}
}
}

 2.中序遍历

void PreOrderTraversal(BinTree BT)
{
BinTree T=BT;
Stack S=CreatStack(MaxSize);
while(T || !IsEmpty)(S){
while(T){
printf("%d\n",T->Data);
Push(S,T);
T=T->Left;
}
if(!IsEmpty(S)){
T=Pop(S);
T=T->Right;
}
}
}

 3.后序遍历(待补)

 

队列实现

4.层次遍历

    void LevelOrderTraversal(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->Data);
if(T->Left) AddQ(Q,T->Left);
if(T->Right) AddQ(Q,T->Right);
}
}

 思路大概是先访问根节点,如果有左右儿子节点,就把左右儿子节点入队,依次循环访问