线索二叉树

二叉树的中序遍历,最简单直接的办法当然是递归,但迭代法也可以解决这一问题,一种思路是利用栈,另一种思路是莫里斯遍历,其中使用了线索二叉树这样一种数据结构。

该算法流程如下:

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官方题解

posted @ 2019-07-01 23:55  没有窗户的小巷  阅读(92)  评论(0编辑  收藏  举报