力扣热题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
相关推荐
yeflx几秒前
万向节死锁
python
亿道电子Emdoor2 分钟前
【Perforce】Klocwork-kwgcheck图形化界面无法打开如何解决
git·python·github
aqiu1111112 小时前
【C++算法打怪专栏】8. 字符串转换整数 (atoi)
开发语言·c++·算法
迅猛龙办公室2 小时前
python实现倒序输出数字
开发语言·python
信奥卷王10 小时前
[GESP202609 六级] 分树规划
算法
夏幻灵10 小时前
LeetCode 21:合并两个有序链表——双指针与哑节点详解
算法·leetcode·链表
全栈练习生11 小时前
AI Agent 沙箱
python·ai
徐小黑ACG12 小时前
Golang 基础05 结构体struct
开发语言·算法·golang
Navigator_Z12 小时前
LeetCode //C - 1286. Iterator for Combination
c语言·算法·leetcode