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