二叉树遍历的核心问题:二维结构的线性化
- 从结点访问其左、右儿子结点
- 访问左儿子后,右儿子结点怎么办?
- 需要一个存储结构保存暂时不访问的结点
- 存储结构:堆栈、队列
层次遍历
- 队列实现:遍历从根结点开始,首先将根结点入队,然后开始执行循环:结点出队、访问该结点、其左右儿子入队
层序基本过程:先根结点入队,然后:
- 从队列取出一个元素
- 访问该元素所指结点
- 若该元素所指结点的左、右孩子结点非空,则将其左、右孩子的指针顺序入队
void LevelOrderTraversal(BinTree BT)
{
Queue Q; BinTree T;
if (!BT) return;
Q=CreatQueue(MaxSize);
Add(Q,BT);
while (!isEmptyQ(Q))
{
T=Delete(Q);
printf("%d\n",T->Data);
if (T->Left) AddQ(Q,T->Left);
if (T->Right) AddQ(Q,T->right);
}
}