采用堆栈实现
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);
}
}
思路大概是先访问根节点,如果有左右儿子节点,就把左右儿子节点入队,依次循环访问