首页 > 其他分享 >Leetcode刷题day12-二叉树.前中后序遍历

Leetcode刷题day12-二叉树.前中后序遍历

时间:2023-12-12 13:12:23浏览次数:28  
标签:head right 前中 self 二叉树 day12 left stack vec

递归法实现前.中.后序遍历

代码随想录 (programmercarl.com)
解题思路
前序遍历:头->左->右
中序遍历:左->头->右
后序遍历:左->右->头
递归法实现流程:1.定义递归函数;2.寻找递归终止条件;3.设计单层递归模块

class Solution():
	def __init__(self,val=0,left=None,right=None):
		self.val = val
		self.left = left
		self.right = right
		
	def first_loop(self,head,vec):  # 前序遍历
		if head is None:
			return 
		vec.append(head.val)
		first_loop(head.left,vec)
		first_loop(head.right,vec)
		return vec

	def mid_loop(self,head,vec):    # 中序遍历
		if head is None:
			return 
		mid_loop(head.left,vec)
		vec.append(head.val)
		mid_loop(head.right,vec)
		return vec

	def last_loop(self,head,vec):   # 后序遍历
		if head is None:
			return 
		last_loop(head.left,vec)
		last_loop(head.right,vec)
		vec.append(head.val)
		return vec

迭代法实现前.中.后序遍历

代码随想录 (programmercarl.com)
解题思路
栈:先将头节点压入空栈,当栈不为空时,执行遍历操作

class Solution():
	def __init__(self,val=0,left=None,right=None):
		self.val = val
		self.left = left
		self.right = right

	def fist_loop(self,head,vec):  # 前序遍历-迭代法
		if not head:
			return []
		stack = [head.val]
		while stack:
			a = stack.pop()
			vec.append(a)
			if head.right:
				stack.append(head.right)
			if head.left:
				stack.append(head.left)
		return vec

	def mid_loop(self,head,vec):  # 中序遍历-迭代法
		if not head:
			return []
		stack = []
		while head or stack:
			if head:   # 先进入最左子节点
				stack.apppend(head)
				head = head.left
			else:     # 从最左子节点->上一层->右子节点
				head = stack.pop()
				vec.append(head.val)
				head = head.right
		return vec

	def last_loop(self,head,vec):  # 后序遍历-迭代法
		if head is None: return []   
		stack = [head.val]
		while stack:  # 根据前右左构建vec,再反转vec,即得后序遍历结果
			cur = stack.pop()
			vec.append(cur.val)
			if cur.left:
				stack.append(cur.left)
			if cur.right:
				stack.append(cur.right)
		return vec[::-1]

标签:head,right,前中,self,二叉树,day12,left,stack,vec
From: https://www.cnblogs.com/lzj2023/p/17896545.html

相关文章

  • 226. 翻转二叉树
    目录题目题解:DFS题目给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。题解:DFSclassSolution:definvertTree(self,root:Optional[TreeNode])->Optional[TreeNode]:#空树,交换左右子树,递归左右子树ifnotroot:return......
  • 8.平衡二叉树
    110.平衡二叉树1、概要给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。示例1:给定二叉树[3,9,20,null,null,15,7]和二叉树最大深度有很大区别leetcode中强调的深度和高度很......
  • 7.完全二叉树的节点个数
    222.完全二叉树的节点个数1、概要给出一个完全二叉树,求出该树的节点个数。示例1:输入:root=[1,2,3,4,5,6]输出:6首先按照普通二叉树的逻辑来求。这道题目的递归法(后序)和求二叉树的深度(取MAX)写法类似,而迭代法,遍历模板稍稍修改一下,记录遍历的节点数量就可以了2、思路......
  • day12栈与队列
    239.滑动窗口最大值;347.前K个高频元素;总结1滑动窗口最大值1.1思路封装一个deque类:主要构造pop、push的逻辑然后使用循环来进行遍历,更新最大值1.2代码二刷补充2前K个高频元素给定一个非空的整数数组,返回其中出现频率前k高的元素。示例1:输入:nums=[1,1,1,......
  • 5.二叉树的最大深度
    104.二叉树的最大深度1、概要给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。可以使用前序求深度,也可以使用后序求高度。二叉树节点的深度:指从根节点到该节点的最长简单......
  • C++U5-09-二叉树2
    二叉树(二)二叉树遍历是一种重要的操作,它在许多应用场景中被广泛使用。以下是一些常见的应用场景:查找和搜索:二叉树遍历可以用于查找特定元素或者进行搜索操作。通过遍历整棵树,可以找到目标元素并进行相应的处理。例如,在二叉搜索树中查找某个特定值,或者在字典树中搜索以某个前缀......
  • 111. 二叉树的最小深度
    目录题目完美踩坑题解题目给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。示例1:输入:root=[3,9,20,null,null,15,7]输出:2示例2:输入:root=[2,null,3,null,4,null,5,null,6]输出:5完美踩坑之前好几个题做过求树的高......
  • 数据结构--二叉树的生成和遍历(9)
    好久没有更新博客了,关于二叉树也查了不少资料,下面写上我对二叉树的理解。一、什么是二叉树二叉树是一种树形结构,其中每个节点的叶子节点不超过两个,而且二叉树的左右子树是有顺序的,顺序不能颠倒如下图所示,一下四种都属于二叉树。  二、特殊的二叉树1.满二叉树:听名......
  • 【JavaSE】数据结构(树:二叉查找树、平衡二叉树、AVL树、红黑树)
    树度:每个节点的子节点数量树高:树的总层数根节点:入度为0的节点二叉树每个节点最多有两个子节点二叉查找树任意节点左子树上的节点都小于当前节点,右子树上的节点都大于当前节点平衡二叉树任意节点的左右子树的高度差不超过1AVL树AVL树是一种平衡二叉树,得名于其发明者的......
  • 110. 平衡二叉树
    目录题目自顶向下自顶向下正解自底向上(优)题目给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。自顶向下首先,对当前节点进行处理,计算左孩子的高度,右孩子的高度,两者高度差若大......