94. Binary Tree Inorder Traversal

Given a binary tree, return the inorder traversal of its nodes' values.

Example:

Input: [1,null,2,3]
   1
    \
     2
    /
   3

Output: [1,3,2]

Follow up: Recursive solution is trivial, could you do it iteratively?

解法

递归

中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它本身,最后打印它的右子树。

中序遍历的递推公式:

inOrder(r) = inOrder(r->left)->print r->inOrder(r->right)

加入条件判断可以减少函数调用,增加效率。

时间复杂度:O(n),T(n)=2T(n/2)+1O(n), T(n) = 2 \cdot T(n/2)+1

空间复杂度:最坏情况下 O(n)O(n),平均情况下 O(logn)O(\log n)nn 为节点数目。

迭代

迭代需要使用栈记录节点。

莫里斯遍历

在这种方法中,我们必须使用一种新的数据结构——线索二叉树,策略如下:

例如:

首先,1 是根节点,所以初始化 1 为 current, 1 有左子树,也就是 2, current 的左子树是

所以在这个子树中,最右边的节点是5,然后让 current(1) 作为 5 的右子节点。Set current = cuurent, left (current = 2)。树现在看起来像这样

对于当前的 2,它有左孩子 4,我们可以继续上面的过程

然后添加4,因为它没有左子节点,然后依次添加2、5、1、3,对于左子节点6的节点3,执行上面的操作。最后,逆序是[4,2,5,1,6,3]。

Last updated

Was this helpful?