力扣热题100之二叉树的中序遍历

题目

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

代码

方法一:递归

bash 复制代码
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        result = []
        def traverse(node: Optional[TreeNode]):
            if not node:
                return
            traverse(node.left)    # 递归左子树
            result.append(node.val) # 访问根节点
            traverse(node.right)    # 递归右子树
        traverse(root)
        return result

方法二:迭代

使用栈来代替左节点的递归

bash 复制代码
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res=[]
        stack=[]
        cur=root
        while cur or stack:
            while cur :
                stack.append(cur)
                cur=cur.left
            
            cur=stack.pop()
            res.append(cur.val)
            cur=cur.right
        return res

方法三:颜色标记

这是评论区中的一个方法,在每个节点之前使用1来标记节点是否每个子树的根节点,0标记每个子树的左右节点。

通过改变节点入栈的顺序来确定二叉树的遍历方法。因为栈具有先进后出的特点,所以在进行中序遍历的时候是右、中、左节点先后入栈,因为出栈的时候是左、中、右出栈。

bash 复制代码
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        WHITE,GRAY=0,1
        res=[]
        stack=[(WHITE,root)]
        while stack:
            color,node=stack.pop()
            if node is None:continue
            if color==WHITE:
                stack.append((WHITE,node.right))
                stack.append((GRAY,node))
                stack.append((WHITE,node.left))
            else:
                res.append(node.val)
        return res
相关推荐
叶 落几秒前
三种语言写 MCP
java·python·ai·typescript·mcp
hao_wujing6 分钟前
CNN工作原理和架构
算法
呆呆的小鳄鱼6 分钟前
leetcode:面试题 08.06. 汉诺塔问题
leetcode·面试·职场和发展
钢铁男儿1 小时前
C# 数组(数组是对象和一维数组和矩形数组)
算法·c#
___波子 Pro Max.3 小时前
python list去重
python·list
狐凄5 小时前
Python实例题:基于边缘计算的智能物联网系统
python·物联网·边缘计算
@十八子德月生5 小时前
第十章——8天Python从入门到精通【itheima】-99~101-Python基础综合案例-数据可视化(案例介绍=JSON格式+pyecharts简介)
大数据·python·信息可视化·pycharm·echarts·数据可视化
W说编程5 小时前
算法导论第二十四章 深度学习前沿:从序列建模到创造式AI
c语言·人工智能·python·深度学习·算法·性能优化
寒燕舞6 小时前
2012 - 正方形矩阵
数据结构·算法
动能小子ohhh6 小时前
html实现登录与注册功能案例(不写死且只使用js)
开发语言·前端·javascript·python·html