这篇文章是想写二叉树的先序遍历,中序遍历和后序遍历的各种递归和非递归算法。
1,首先给出二叉树的一个样例
2 各种遍历算法的概念
* 先序遍历 : 从根节点开始,先遍历跟节点,然后先序遍历其左子树,最后先序遍历其右子树
* 中序遍历 : 先左然后是根节点最后是右子树
* 后序遍历 : 先左后右最后才是根节点
3 各种遍历算法对样例的结果:
* 先序遍历 : ABDHTECFG
* 中序遍历 : HDTBEAFCG
* 后序遍历 : HTDEBFGCA
4 递归算法
* 先序遍历 :
其他算法依次类推,左节点,右节点,根节点递归的顺序不同~
5 非递归算法
5.1非递归算法需要的数据结构:
* 用来存放节点指针以及左右子节点是否访问的标识的结构体
* 用来存放上面提到的结构体的栈
5.2 具体的算法过程
先需要说明的两个规则(依据算法的不同而不同,此处以先序遍历为例)
* 什么时候打印节点?一旦访问就打印
* 在栈中的节点什么时候退出栈?当左右子节点的标识都有的时候退出栈
* 先序遍历
1 访问根节点同时入栈
2 看栈中当前节点
*左节点有没有访问,如果没有则访问其左节点并入栈,同时把当前节点打上左节点访问的标识 重复第2步
*看右节点是否访问,如果没有则访问其右节点并入栈,同时把当前节点打上右节点访问的标识 退出栈 重复第2步直到栈为空
样例的非递归算法访问图如下:
输出A 输出AB 输出ABD
输出ABDH
因为H左右为空所以退出
|
|
|
|
|
|
|
|
|
| A |
|
|
|
|
|
|
|
| B |
|
Y | A |
|
|
|
|
| D |
|
Y | B |
|
Y | A |
|
| H |
|
Y | D |
|
Y | B |
|
Y | A |
|
Y | H | Y |
Y | D | Y |
Y | B |
|
Y | A |
|
输出 ABDHT 输出ABDHTE 输出ABDHTEC 输出ABDHTCF 输出ABDHTCFG
|
|
|
Y | T | Y |
Y | B | Y |
Y | A |
|
|
|
|
|
|
|
Y | E | Y |
Y | A | Y |
|
|
|
|
|
|
|
|
|
| C |
|
|
|
|
|
|
|
Y | F | Y |
Y | C | Y |
|
|
|
|
|
|
|
|
|
Y | G | Y |
其他算法过程是一样的,只是打印和退出栈的规则不一样而已。