题目

给定一个二叉树,返回它的中序 遍历。

示例:

输入: [1,null,2,3]
   1
    \
     2
    /
   3

输出: [1,3,2]

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

解法

思路:

  • 使用栈来解决,优点是运行速度快,缺点是比较难记忆,我在纸上画图,才捋清楚逻辑。

    从根节点开始,一直遍历左子树,遍历过程中,将遍历到的节点入栈,直到左子树为空,这时候就可以将栈顶的节点出栈,append到结果。
    然后开始遍历栈顶节点的右子树,从右子树的根节点开始,一直遍历它的左子树,和第一步类似。
    LeetCode题解里有示例图,可以结合示例图来理解。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        result = []
        s, cur = [], root
        
        while cur or len(s):
            while cur:
                s.append(cur)
                cur = cur.left
            cur = s.pop()
            result.append(cur.val)
            cur = cur.right           
        return result
  • 递归,递归的解法比较简单。
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        elif root.left and root.right:
            return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)
        elif root.left:
            return self.inorderTraversal(root.left) + [root.val]
        elif root.right:
            return [root.val] + self.inorderTraversal(root.right)
        else:
            return [root.val]
Last modification:May 17th, 2020 at 01:01 pm
如果觉得我的文章对你有用,请尽情赞赏 🐶