二叉树遍历方式:
二叉树有四种遍历方式,分别是前序遍历、中序遍历、后序遍历、层序遍历
-
前序遍历:根—>根的左子树—>根的右子树
-
中序遍历:根的左子树—>根—>根的右子树
-
后序遍历:根的左子树—>根的右子树—>根
-
层序遍历:按每一层从左到右的顺序遍历,最符合人类思维
图根本不是画给人看的,也太乱了吧!~
但是根本在于,只要知道是如何遍历的,顺序不错就可以了,选择题应该没问题
前序遍历递归图示:
中序遍历递归图示:
后序遍历:
后续遍历就不画图了,遍历结果的最后一个一定是根节点
如下图所示二叉树:
- 根节点为A,左子树存在,递归到B
- B作为根节点,左子树存在,递归到D
- D的左子树不存在,递归D的右子树,也不存在,打印根节点D,回退到B
- B的左子树遍历完,递归遍历B的右子树,不存在,回退到B,打印根节点B,回退到A
- 递归遍历A的右子树C,C的左子树存在,所以递归到E
- E作为根节点,左子树不存在,右子树也不存在,打印当前根节点E,回退到C
- C的左子树遍历结束,遍历C的右子树,递归到F
- F作为根节点,左右子树都不存在,回退到F,打印当前根节点F,回退到C
- C的左右子树都遍历完毕,打印当前根节点C,回退到A
- A的左右子树遍历完毕,打印当前根节点A,程序结束
所以后序遍历输出结果为DBEFCA
层序遍历的思路:
- 把根节点存入队列中
- 利用队列先进先出的特性,依次取出队头,打印
- 队头节点有左孩子或者右孩子就保存
- 删去队头元素
上面的操作都是循环的,循环跳出条件是队列为空
层序遍历过程图示:
所以层序遍历输出结果为ABCDEF
层序遍历代码示例:
#include<queue>
#include<vector>
#include<iostream>
using namespace std;
// 层序遍历
void LevelOrder(BTNode* pRoot)
{
queue<BTNode*> q;
q.push(pRoot);
while (q.empty()!=true)
{
//取队头元素
BTNode* p=q.front();
//遍历该元素
cout << p->_data <<" ";
//如果左孩子存在,保存
if (p->_pLeft != nullptr)
{
q.push(p->_pLeft);
}
//如果右孩子存在,保存
if (p->_pRight != NULL)
{
q.push(p->_pRight);
}
//删除队头
q.pop();
}
}