LeetCode 94. 二叉树的中序遍历 | Python

94. 二叉树的中序遍历


题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/binary-tree-inorder-traversal

题目


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

示例:

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

输出: [1,3,2]

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

解题思路


思路:递归、迭代(借助栈)

递归

关于中序遍历,我们了解到的说法可能是这样的:先遍历左子树,然后访问根节点,最后遍历左子树。不能说错,但是其中还是存在些许的歧义,下面两篇文章篇幅涉及遍历方面存在歧义的情况,有兴趣可以点击下方链接进行了解,(以下两篇文章来源: 笨猪爆破组

「手画图解」用栈模拟中序遍历,怎么做以及为什么 | 递归与迭代

谈谈别的,前、中、后序遍历的区别只有一点

先说中序遍历的输出顺序,这一点我们可能会记住类似【左根右】的口诀,也就是左子树、根、左子树。

二叉树的中序遍历,在遍历时会先访问根节点,然后是左子树,再是右子树,只不过处理节点值是放在访问完左子树之后(这就是区别于先序、后序遍历的地方)。而在访问左子树或右子树的时候,还是会以同样的方式去遍历。那么这里我们就可以考虑使用递归去解决。

根据上面的分析,这里直接放代码:

# 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]:
        def inorder(root):
            if not root:
                return
            
            inorder(root.left)
            # 递归完左子树后,处理节点值
            ans.append(root.val)
            inorder(root.right)
        
        ans = []
        inorder(root)
        return ans
迭代(栈)

进阶中提及,是否能够用迭代的方法实现?

这里我们需要借助栈模拟递归来实现迭代。

这里直接用图示来说明,如何去用栈模拟递归,如下:

图示

根据上面图示思路,实现代码如下。

# 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]:
        ans = []
        stack = []

        while stack or root:
            if root:
                # 这部分将左子树压入栈中
                stack.append(root)
                root = root.left
            else:
                # 进入右子树前处理值
                tmp = stack.pop()
                ans.append(tmp.val)
                # 进入右子树,继续循环
                root = tmp.right
            
        return ans

欢迎关注


公众号 【书所集录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值