当前位置:网站首页>二叉树 | 递归遍历 | 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
边栏推荐
- "DevOps Night Talk" - Pilot - Introduction to CNCF Open Source DevOps Project DevStream - feat. PMC member Hu Tao
- gcc492 compile `.rodata‘ can not be used when making a PIE object; recompile with -fPIE
- 阿里云新增三大高性能计算解决方案,助力生命科学行业快速发展
- fme csmapreprojector转换器使用高程异常模型进行高程基准转换
- 这款可视化工具神器,更直观易用!太爱了
- “数据引擎”开启前装规模量产新赛道,「智协慧同」崭露头角
- Addition of linked lists (2)
- 实例050:随机数
- 阿里云张新涛:支持沉浸式体验应用快速落地,阿里云云XR平台发布
- 【开源教程5】疯壳·开源编队无人机-飞控固件烧写
猜你喜欢

68:第六章:开发文章服务:1:内容梳理;article表介绍;创建【article】文章服务;

GMT,UTC,CST,DST,RTC,NTP,SNTP,NITZ: 嵌入式的时间

交换机和生成树知识点

MySQL学习笔记(1)——基础操作

Distribution Network Expansion Planning: Consider Decisions Using Probabilistic Energy Production and Consumption Profiles (Matlab Code Implementation)

Qualcomm Platform Development Series Explanation (Application) Introduction to QCMAP Application Framework
云服务器基于 SSH 协议实现免密登录

fme csmapreprojector转换器使用高程异常模型进行高程基准转换

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

What is Jmeter? What are the principle steps used by Jmeter?
随机推荐
计算需要的MIPI lane数目
VulnHub之DC靶场下载与DC靶场全系列渗透实战详细过程
亲测有效|处理风控数据特征缺失的一种方法
win系统下pytorch深度学习环境安装
Extended Chinese Remainder Theorem
web项目访问引用jar内部的静态资源
解码2022中国网安强星丨正向建、反向查,华为构建数字化时代的网络安全防线
3598. Binary tree traversal (Huazhong University of Science and Technology exam questions)
LeetCode每日两题01:反转字符串 (均1200道)方法:双指针
分享一个后台管理系统可拖拽式组件的设计思路
ArcGIS应用基础知识
MySQL: MySQL Cluster - Principle and Configuration of Master-Slave Replication
金山云CEO王育林离职:正值冲刺港股之际 雷军曾送金砖
高通平台开发系列讲解(应用篇)QCMAP应用框架介绍
商家招募电商主播要考虑哪些内容
CIKM2022 | 基于双向Transformers对比学习的序列推荐
Redis
谁是边缘计算服务的采购者?是这六个关键角色
ThreadLocal comprehensive analysis (1)
高学历毕业生,该学单片机还是plc?
