天天看点

二叉树遍历

行文结构

递归方法(前中后)

非递归方法(前中后层)

微软面试题

二叉树遍历根据“根节点”遍历时相对的次序分为前序、中序、后序。图示为相对于根节点的次序,左右子树也是一样的规则。

二叉树遍历
二叉树遍历
二叉树遍历

                     前序遍历                                             中序遍历                                                后续遍历

1. 递归方法

前序遍历

<a></a>

中序遍历

后续遍历

整合参考程序

 View Code

结果

二叉树遍历

2. 非递归方法

非递归方法借助于栈,“记忆”走过的结点。

“根-左孩子-右孩子”,对每一个结点看成是根节点,先输出,后入栈(到时返回访问右孩子),然后访问左孩子。当不能在往左走时,查询栈中的记忆,根据栈顶进入右孩子,重复上边的故事。

“左孩子-根-右孩子”,对每一个结点看成是根节点,先入栈(到时返回访问自己和右孩子),然后访问左孩子。当不能在往左走时,查询栈中的记忆,根据栈顶访问自己并且进入右孩子,重复上边的故事。

“左孩子-右孩子-根”,为了达到这个效果,需要把把按“根--&gt;右孩子--&gt;左孩子”的顺序入栈,因为栈的特征是先进后出,所以访问时顺序相反。对于一个结点只有满足以下两个条件时,才访问,否则按“根--&gt;右孩子--&gt;左孩子”顺序入栈。

左右孩子全为NULL

前边访问的结点正好为当前结点的左孩子或右孩子(访问了左孩子必定已经访问了右孩子)

结果同递归遍历

层次遍历

3. 微软面试题

二叉树遍历

分析:由二叉遍历树变成有序的结构,不用说绝对是中序遍历。中序遍历分为两种方法——递归、非递归。递归不需要额外的空间,非递归需要额外空间(借助与栈)。现在用两种方法实现,其思路都是基本中序遍历的改进。

方法一(递归方法)

执行程序

方法二(非递归方法)

本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3431409.html,如需转载请自行联系原作者