博客园 首页 私信博主 显示目录 隐藏目录 管理

二叉树的前序,中序,后序遍历——递归和非递归实现

前序遍历:按照“根-左-右”的顺序遍历。

中序遍历:按照“左-根-右”的顺序遍历。

后序遍历:按照“左-右-根”的顺序遍历。

递归版:

递归版的代码非常简单,我给大家分析一下原理。

①我们先忽略中间的打印语句,单独分析这个函数

②遍历顺序是不是这样的。

1->2->4->null->4->null->4->2->5->null->5->null->5->2->1->3->6->null->6->null->6->7->null->7->null->7->3->1

③我们把null去掉。

1->2->4->4->4->2->5->5->5->2->1->3->6->6->6->3->7->7->7->3->1

④里面的每一个数都出现了3次。

⑤若我们将这些数第一次出现就打印。就是先序遍历。

1->2->4->5->3->6->7

⑥若我们将这些数第二次出现就打印。就是中序遍历

4->2->5->1->6->3->7

⑦若我们将这些数第三次出现就打印。就是后序遍历

4->5->2->6->7->3->1

中序遍历代码:

后序遍历代码:

非递归版:

先序遍历。①先准备一个栈②先将根节点压入栈③弹出一个节点。打印节点。④若右孩子不为null,就将右孩子压栈。⑤若左孩子不为null,就将左孩子压栈。⑥重复3,4,5步直到栈为空。代码实现

中序遍历①先准备一个栈②若当前节点不为空,将当前节点压栈,然后来到左孩子③若当前节点为空,弹出一个节点并打印。然后来到右孩子。④当前节点非空或栈不为空执行2,3。代码实现

后序遍历后序遍历如果只用一个栈来实现有点麻烦。递归版可以做到将一个节点压入栈中3次。自己压栈则有些麻烦。我们采用使用两个栈的方式来实现后序遍历。在实现前序遍历的非递归实现时,①压根节点,②压右节点,③压左节点(根->左->右)这样我们可以①压根节点,②压左节点,③压右节点将它放入一个栈中(根->右->左)然后将上面的栈倒进另一个栈中。就变成了(左->右->根)。为后序遍历顺序。2.代码实现:

全部代码:

运行结果:

转载自https://baijiahao.baidu.com/s?id=1652242076931729515&wfr=spider&for=pc
posted @ 2020-06-18 17:45  草木皆斌  阅读(364)  评论(1编辑  收藏  举报