标签:算法 问题 遍历 直接 bsp 递归 举例 流程 依次
二叉树的中序遍历,最简单直接的办法当然是递归,但迭代法也可以解决这一问题,一种思路是利用栈,另一种思路是莫里斯遍历,其中使用了线索二叉树这样一种数据结构。
该算法流程如下:
Step 1: 将当前节点current初始化为根节点
Step 2: While current不为空,
若current没有左子节点
a. 将current添加到输出
b. 进入右子树,亦即, current = current.right
否则
a. 在current的左子树中,令current成为最右侧节点的右子节点
b. 进入左子树,亦即,current = current.left
举例而言:
1
/ \
2 3
/ \ /
4 5 6
首先,1 是根节点,所以将 current 初始化为 1。1 有左子节点 2,current 的左子树是
2
/ \
4 5
在此左子树中最右侧的节点是 5,于是将 current(1) 作为 5 的右子节点。令 current = cuurent.left (current = 2)。 现在二叉树的形状为:
2
/ \
4 5
\
1
\
3
/
6
对于 current(2),其左子节点为4,我们可以继续上述过程
4
\
2
\
5
\
1
\
3
/
6
由于 4 没有左子节点,添加 4 为输出,接着依次添加 2, 5, 1, 3 。节点 3 有左子节点 6,故重复以上过程。 最终的结果是 [4,2,5,1,6,3]。
该算法时间与空间复杂度均为O(n)。
解释来源于leetcode官方题解
标签:算法 问题 遍历 直接 bsp 递归 举例 流程 依次
原文地址:https://www.cnblogs.com/txltxl22/p/11117668.html