当前位置:网站首页>二叉树 | 递归遍历 | leecode刷题笔记
二叉树 | 递归遍历 | leecode刷题笔记
2022-08-10 22:22:00 【Begonia_cat】
文章目录
跟随carl代码随想录刷题
语言:python
递归法与迭代法哪个更好呢?
- 递归法
空间复杂度大一些,因为递归需要系统堆栈存参数返回值等等。- 递归
更容易让程序员理解,但收敛不好,容易栈溢出。- 递归是
方便了程序员,难为了机器(各种保存参数,各种进栈出栈)。- ️在实际项目开发的过程中我们是要
尽量避免递归!因为项目代码参数、调用关系都比较复杂,不容易控制递归深度,甚至会栈溢出。——代码随想录
二叉树的递归遍历——深度优先
- 递归的实现就是:每一次递归调用都会把函数的
局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各项参数。 - 三要素:
- 确定递归函数的参数和返回值
def traversal(root: TreeNode):# 前序遍历
- 确定终止条件
if (root == None) return;如果当前遍历的节点为空就返回
- 确定单层递归的逻辑
result.append(root.val)# 中traversal(root.left)# 左traversal(root.right)# 右
- 确定递归函数的参数和返回值
- ️
前序遍历、中序遍历、后序遍历代码的唯一区别就是:中、左、右三个子句的顺序区别。
144. 二叉树的前序遍历
题目:给你二叉树的根节点 root ,返回它节点值的
前序遍历。
完整代码如下
# 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]:
# 1. 初始化一个列表用于后续存放结果
result = []
# 2. 定义前序遍历的递归过程
def traversal(root:TreeNode):
if root == None:
return
result.append(root.val)
traversal(root.left)
traversal(root.right)
# 3. 调用前序遍历的递归函数
traversal(root)
# 4. 结果集
return result
94. 二叉树的中序遍历
题目:给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
完整代码如下
# 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]:
# 1. 初始化一个列表用于存放结果集
result = []
# 2. 中序遍历的函数
def traversal(root:TreeNode):
if root == None:
return
traversal(root.left)
result.append(root.val)
traversal(root.right)
# 3. 调用中序遍历函数
traversal(root)
# 4. 返回结果集
return result
145. 二叉树的后序遍历
题目:给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。
完整代码如下
# 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]:
# 1. 初始化一个列表用于存放结果集
result = []
# 2. 中序遍历的函数
def traversal(root:TreeNode):
if root == None:
return
traversal(root.left)
traversal(root.right)
result.append(root.val)
# 3. 调用中序遍历函数
traversal(root)
# 4. 返回结果集
return result
N叉树的递归遍历
589. N 叉树的前序遍历
题目:给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历 。
n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
题目分析
和二叉树的写法几乎一样,唯一区别:for ch in root.children: traversal(ch)
完整代码如下
""" # Definition for a Node. class Node: def __init__(self, val=None, children=None): self.val = val self.children = children """
class Solution:
def preorder(self, root: 'Node') -> List[int]:
# 1. 初始化一个列表用于后续存放结果
result = []
# 2. 定义前序遍历的递归过程
def traversal(root):
if root == None:
return
result.append(root.val)
for ch in root.children:
traversal(ch)
# traversal(root.right)
# 3. 调用前序遍历的递归函数
traversal(root)
# 4. 结果集
return result
590. N 叉树的后序遍历
题目:给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历 。
n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
输入:root = [1,null,3,2,4,null,5,6]
输出:[5,6,3,2,4,1]
题目分析
- 和二叉树的写法几乎一样,唯一区别:
for ch in root.children: traversal(ch) - 只用在上一题
N叉树的前序遍历的基础上调换代码位置,即可实现后序遍历。
完整代码如下
""" # Definition for a Node. class Node: def __init__(self, val=None, children=None): self.val = val self.children = children """
class Solution:
def postorder(self, root: 'Node') -> List[int]:
# 1. 定义空列表用于存放结果集
result = []
# 2. 定义函数
def traversal(root):
if root == None:
return
for ch in root.children:
traversal(ch)
result.append(root.val)
# 调用函数
traversal(root)
# 返回函数
return result
边栏推荐
- 阿里云张新涛:支持沉浸式体验应用快速落地,阿里云云XR平台发布
- 诺诚健华通过注册:施一公家族身价15亿 高瓴浮亏5亿港元
- 2021 IDEA creates web projects
- Why general company will say "go back messages such as" after the end of the interview, rather than just tell the interviewer the result?
- make & cmake
- LeetCode每日两题02:反转字符串中的单词 (均1200道)
- HanLP词性表
- 2022年8月10日:使用 ASP.NET Core 为初学者构建 Web 应用程序--使用 ASP.NET Core 创建 Web UI(没看懂需要再看一遍)
- gcc492 compile `.rodata‘ can not be used when making a PIE object; recompile with -fPIE
- “数据引擎”开启前装规模量产新赛道,「智协慧同」崭露头角
猜你喜欢

解码2022中国网安强星丨正向建、反向查,华为构建数字化时代的网络安全防线

高通平台开发系列讲解(应用篇)QCMAP应用框架介绍

RecyclerView滑动监听

leetcode:355. 设计推特

MySQL:MySQL的集群——主从复制的原理和配置

RK3399平台开发系列讲解(内核驱动外设篇)6.35、IAM20680陀螺仪介绍

LabVIEW分配多少线程?

Nodes in the linked list are flipped in groups of k

3598. 二叉树遍历(华中科技大学考研机试题)

This visual tool artifact is more intuitive and easy to use!love so much
随机推荐
特别的三杯鸡
fme csmapreprojector转换器使用高程异常模型进行高程基准转换
ASCII、Unicode和UTF-8
uni-app微信小程序——下拉多选框
DC-7靶场下载及渗透实战详细过程(DC靶场系列)
美味的佳肴
DC-8靶场下载及渗透实战详细过程(DC靶场系列)
Black cats take you learn Makefile article 13: a Makefile collection compile problem
罗克韦尔AB PLC RSLogix5000中计数器指令使用方法介绍
艺术与科技的狂欢,阿那亚2022砂之盒沉浸艺术季
电力系统潮流计算(牛顿-拉夫逊法、高斯-赛德尔法、快速解耦法)(Matlab代码实现)
Fatal error: cstring: No such file or directory
H3C S5130 IRF做堆叠
pytorch tear CNN
《DevOps围炉夜话》- Pilot - CNCF开源DevOps项目DevStream简介 - feat. PMC成员胡涛
LabVIEW分配多少线程?
高数_复习_第5章:多元函数微分学
geemap的详细安装步骤及环境配置
带着昇腾去旅行:一日看尽金陵城里的AI胜景
Merge k sorted linked lists
