当前位置: 首页 > news >正文

25期代码随想录算法训练营第十四天 | 二叉树 | 递归遍历、迭代遍历

目录

  • 递归遍历
    • 前序遍历
    • 中序遍历
    • 后序遍历
  • 迭代遍历
    • 前序遍历
    • 中序遍历
    • 后序遍历

递归遍历

前序遍历

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:if not root:return []left = self.preorderTraversal(root.left)right = self.preorderTraversal(root.right)return [root.val] + left + right

中序遍历

# Definition for a binary tree node.
# 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 []left = self.inorderTraversal(root.left)right = self.inorderTraversal(root.right)return left + [root.val] + right

后序遍历

# Definition for a binary tree node.
# 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 []left = self.postorderTraversal(root.left)right = self.postorderTraversal(root.right)return left + right + [root.val]

迭代遍历

前序遍历

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:if not root:return []stack = [root]res = []while stack:cur = stack.pop()res.append(cur.val)  # 在这里加入节点值# 先右后左地加入子节点到栈中if cur.right:stack.append(cur.right)if cur.left:stack.append(cur.left)return res

中序遍历

为什么这样能实现左中右的逻辑?
在这里插入图片描述
为什么需要使用while cur or stack?
在这里插入图片描述

# Definition for a binary tree node.
# 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 []stack = []res = []cur = rootwhile cur or stack:if cur:stack.append(cur)cur = cur.leftelse:cur = stack.pop()res.append(cur.val)cur = cur.rightreturn res

后序遍历

中右左 ---->再颠倒顺序成为 左右中

# Definition for a binary tree node.
# 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()res.append(node.val)if node.left:stack.append(node.left)if node.right:stack.append(node.right)return res[::-1]
http://www.lryc.cn/news/226546.html

相关文章:

  • 常用布局以及其优缺点
  • 海康工业相机如何提高相机帧率
  • Linux之IPC通信共享内存(一次拷贝)与消息队列、管道、信号量、socket(两次拷贝)总结(六十二)
  • 【多线程 - 01、概述】
  • SQL SELECT INTO 语句
  • 【刷题】(AtCoder Beginner Contest 328) C、D 补题
  • NI USRP软件无线设备的特点
  • 大数据毕业设计选题推荐-污水处理大数据平台-Hadoop-Spark-Hive
  • 最新获取支付宝cardIndex参数图文教程
  • Linux学习第二枪(yum,vim,g++/gcc,makefile的使用)
  • 自然语言处理(一):RNN
  • 超全总结!大模型算法面试指南(含答案)
  • 前端使用C-lodop 实现循环套打小案例
  • 基于SpringBoot+Vue+mysql卓越导师双选系统设计与实现
  • Windows 11系统cmd终端美化、Vscode终端美化
  • [游戏中的图形学实时渲染技术] Part1 实时阴影技术
  • NtripShare Mos地铁自动化监测终端盒子硬件设计
  • 第 117 场 LeetCode 双周赛题解
  • OpenCV C++ 图像处理实战 ——《多二维码识别》
  • 经典算法(查找与排序)
  • 微软和Red Hat合体:帮助企业更方便部署容器
  • ZYNQ_project:IP_ram_pll_test
  • Leetcode刷题详解——优美的排列
  • [PHP]Kodexplorer可道云 v4.47
  • C/C++数字判断 2021年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
  • 云栖大会丨桑文锋:打造云原生数字化客户经营引擎
  • 如何用java写一个网站:从零搭建个性化网站
  • Easyui DataGrid combobox联动下拉框内容
  • 力扣学习笔记——11. 盛最多水的容器
  • Spring Boot: 约定优于配置的软件设计思想