LeetCode in Python 94. Binary Tree Inorder Traversal (二叉树的中序遍历)

本文详细介绍了二叉树中序遍历的递归和迭代方法,以及迭代过程中的逻辑分析,强调了迭代法中栈的作用和节点处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树中序遍历的思想跟前序遍历相似,也是可以有递归和迭代两种解法。其中需要注意的是前序遍历的迭代过程仅仅关注根结点即可,即不断锁定新的根节点位置,因为前序遍历的过程为根左右,而中序遍历则需要先把二叉树所有节点的左结点先压入栈中,然后再逐一弹出左结点和根结点,最后是右结点。

示例1:

还是根据示例1给出递归和迭代两种方法的代码。

代码:

递归法:

class Solution:
    def inorderTraversal(self, root):
        if root is None:
            return []
        return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)

迭代法:

class Solution:
    def inorderTraversal(self, root):
        stack = []
        result = []

        while root or stack:
            while root:
                stack.append(root)
                root = root.left
            root = stack.pop()
            result.append(root.val)
            root = root.right
        return result

分析迭代法:

(1) while root部分主要是判断三种情况:

        一是root一开始即为None 直接结束输出[];

        二是root在迭代过程中到了一个空的左指针,即无左结点的时候跳出循环,此时所有结点的左结点全部压入栈中,可以开始pop操作了;

        三是迭代过程中到了一个空的右指针,即某个结点无右结点,此时直接退出循环,pop出栈中最上面的结点即可继续迭代。

(2) stack.append(root)

      root = root.left

         这两步即不断弹入所有结点的左结点直至没有左结点
(3)  root = root.right

        这一步是提醒将一个结点弹出后要判断此结点有无右结点,若有继续压入右结点的左子结点,若没有直接跳出while root,重新从stack最顶端弹出一个新的结点开始新一轮迭代。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值