24【简单】二叉树的中序遍历

 一、题目描述

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


二、解题思路过程

递归1:最好理解的方式

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        return []+self.inorderTraversal(root.left)+[root.val]+self.inorderTraversal(root.right)

递归2:可以适应不同的题目,添加参数、增加返回条件、修改进入递归条件、自定义返回值

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        def tree(n):
            if not n:
                return
            tree(n.left)
            res.append(n.val)
            tree(n.right)
        res=[]
        tree(root)
        return res

三、复杂度分析

时间复杂度:O(n),n为节点数,访问每个节点恰好一次。
空间复杂度:空间复杂度:O(h),h为树的高度。最坏情况下需要空间O(n),平均情况为O(logn)


四、进阶思路分析

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

颜色标记法:

  • 使用颜色标记节点的状态,新节点为黄色,已访问的节点为绿色。
  • 如果遇到的节点为黄色,则将其标记为绿色,然后将其右子节点、自身、左子节点依次入栈。
  • 如果遇到的节点为绿色,则将节点的值输出。
class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        YELLOW,GREEN=0,1 # 使用颜色进行标记
        res=[]
        stack=[(YELLOW,root)] # 将未遍历过的节点标记为黄色
        while stack:
            color,node=stack.pop()
            if node is None:continue
            if color==YELLOW: 
                '''
                    如果这个节点为黄色,
                    则首先把这个节点的右节点标记为黄色
                    然后再把这个节点标记为绿色
                    最后把这个节点的右节点标记为黄色
                '''
                stack.append((YELLOW,node.right))
                stack.append((GREEN,node))
                stack.append((YELLOW,node.left))
            else: # 如果这个节点为绿色
                res.append(node.val) # 直接把这个节点添加到结果中
        return res

五、题目来源

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-tree-inorder-traversal

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值