二叉树的统一迭代法(统一模板样式)

前言:

http://t.csdnimg.cn/WzCFU(二叉树的前,中,后序递归与迭代法)

在前文中我们发现**迭代法实现的先中后序,其实风格也不是那么统一,除了先序和后序,有关联,中序完全就是另一个风格了,一会用栈遍历,一会又用指针来遍历,**很难写出统一的代码,不像是递归法,实现了其中的一种遍历方式,其他两种只要稍稍改一下节点顺序就可以了。

其实针对三种遍历方式,使用迭代法是可以写出统一风格的代码!

接下来给出统一模板下的迭代法代码及详细注释。

可能第一遍不太好理解,觉得还是之前不统一的迭代写法便于理解,但只需悟透一道(在草稿纸上跟着代码画一遍图)就吃透统一迭代法了

代码及详细注释:

迭代法前序遍历:

python 复制代码
# 定义二叉树节点的类
# class TreeNode:
#    def __init__(self, x):
#        self.val == x
#        self.left == None
#        self.right == None

class Solution:
    def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        stack = [root]  # 使用栈来辅助进行遍历 把根节点root放入堆中
        res = []  # 用于存放前序遍历的结果
        while stack:
            node = stack.pop()  # 弹出栈顶节点
            if node:
                if node.right:
                    stack.append(node.right)  # 先将右子节点压入栈中
                if node.left:
                    stack.append(node.left)  # 再将左子节点压入栈中
                stack.append(node)  # 最后将当前节点压入栈中
                stack.append(None)  # 压入一个空节点作为标记
            else:
                node = stack.pop()  # 如果弹出的是空节点,说明当前节点已经遍历过了,可以将其值加入结果中
                res.append(node.val)
        return res  # 返回前序遍历的结果

迭代法中序遍历:

python 复制代码
# 定义二叉树节点的类
# 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]:
        if not root:  # 根节点为空 返回[]
            return []
        res = []  # 用于存放中序遍历的结果
        stack = [root]  # 使用栈来辅助进行遍历 把root(根节点的值)加入到栈中
        while stack:
            node = stack.pop()  # 弹出栈顶节点
            if node:
                if node.right:
                    stack.append(node.right)  # 先将右子节点压入栈中
                stack.append(node)  # 再将当前节点压入栈中
                stack.append(None)  # 压入一个空节点作为标记
                if node.left:
                    stack.append(node.left)  # 最后将左子节点压入栈中
            else:
                node = stack.pop()  # 如果弹出的是空节点,说明当前节点已经遍历过了,可以将其值加入结果中
                res.append(node.val)
        return res  # 返回中序遍历的结果

迭代法后序遍历:

python 复制代码
# 定义二叉树节点的类
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        res = []  # 用于存放后序遍历的结果
        stack = [root]  # 使用栈来辅助进行遍历
        while stack:
            node = stack.pop()  # 弹出栈顶节点
            if node:
                stack.append(node)  # 将当前节点压入栈中
                stack.append(None)  # 压入一个空节点作为标记
                if node.right:
                    stack.append(node.right)  # 先将右子节点压入栈中
                if node.left:
                    stack.append(node.left)  # 再将左子节点压入栈中
            else:
                node = stack.pop()  # 如果弹出的是空节点,说明当前节点已经遍历过了,可以将其值加入结果中
                res.append(node.val)
        return res  # 返回后序遍历的结果
相关推荐
地平线开发者7 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮7 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者8 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考8 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
孟健10 小时前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
HXhlx11 小时前
CART决策树基本原理
算法·机器学习
码路飞11 小时前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
Wect11 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱12 小时前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
曲幽14 小时前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers