遍历二叉树
遍历二叉树有4种方法,分别是 先序中序后序层次,前3种方法其实本质上是一样的,
我们要先了解前3种遍历过程是怎么样的,先遍历根节点再遍历左子树,再遍历左子树的左子树,直到他的左子树为空,例如A,B,D,H。直到他的左子树为空,再遍历他的右子树,若不为空,则按照上述方法继续遍历,若为空则退回上一个结点,遍历他的右子树,然后一直重复这个过程。例ABDHHHDIIIDBEJJJEEBACFFFCGGGCA这是他的所有遍历过程,会发现每个结点出现3次,先序排序就是在他第一次出现的时候就打印,中序是第二次,后序是第三次。
先序:ABDHIEJCFG
中序:HDIBJEAFCG(还可以看他水平画下来之后从左到右的排序)
后序:HIDJEBFGCA
代码实现分别是
void PreOrderTraverse(BinaryTree*T)
{
if (T == NULL)return;
cout << T->data;
PreOrderTraverse(T->lchild);//遍历左子树
PreOrderTraverse(T->rchild);//遍历右子树
}
void InOrderTraverse(BinaryTree*T)
{
if (T == NULL)return;
InOrderTraverse(T->lchild);
cout << T->data;
InOrderTraverse(T->rchild);
}
void PostOrderTraverse(BinaryTree*T)
{
if (T == NULL)return;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout << T->data;
}
而层序逻辑就更简单了,就是ABCDEFGHIJ一层一层走,从左到右。
而代码则是通过队列来实现。
void LayerOrderTraverse(BinaryTree* T)
{
queue <BinaryTree*>a;
a.push(T);
while (!a.empty())
{
cout << T->data;
if (T->lchild != NULL)a.push(T->lchild);//有左子树则进队
if (T->lchild != NULL)a.push(T->lchild);//有右子树则进队
a.pop();//出队第一个结点
}
}