记录一下最近遇到的几个二叉树的题型(附好用的遍历模板)

本文主要是介绍记录一下最近遇到的几个二叉树的题型(附好用的遍历模板),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

107. 二叉树的层序遍历 II

102. 二叉树的层序遍历

987. 二叉树的垂序遍历

以上三题可共用一个模板(dfs记录数的col和row),不同之处就是使用哈希表的时候调整一下key和value:

# 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 verticalTraversal(self, root: Optional[TreeNode]) -> List[List[int]]:dic=defaultdict(list)def dfs(node,row,col):if node is None:returndic[col].append((row,node.val))dfs(node.left,row+1,col-1)dfs(node.right,row+1,col+1)dfs(root,0,0)ans=[]for _,i in sorted(dic.items()):i.sort()ans.append([j for _,j in i])return ans

145. 二叉树的后序遍历

144. 二叉树的前序遍历

94. 二叉树的中序遍历

二叉树的前中后序遍历虽然是很基础的算法,但是我看到了一个很有意思的解题思路,特此记录一下:

# 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]:"""#方法一white,gray=0,1ans=[]stack=[(white,root)]while stack:color,node=stack.pop()if node is None:continueif color==white:stack.append((white,node.right))stack.append((gray,node))stack.append((white,node.left))else:ans.append(node.val)return ans"""#方法二ans=[]def mid(node):if node is not None:mid(node.left)ans.append(node.val)mid(node.right)mid(root)return ans

236. 二叉树的最近公共祖先

解题思路,先判断两个节点是否处于同一深度,如果不是同一深度,则让更深的节点向上移动至同一深度,随后两节点一同向上移动,直到两节点的父节点是同一节点时停止,这样就找到了最近公共祖先:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:def find_depth(self, root, node):if not root:return 0if root == node:return 1left_depth = self.find_depth(root.left, node)right_depth = self.find_depth(root.right, node)if left_depth > 0:return left_depth + 1elif right_depth > 0:return right_depth + 1else:return 0def find_parent(self, root, node):if not root or not node:return Noneif root.left == node or root.right == node:return rootparent = self.find_parent(root.left, node)if not parent:parent = self.find_parent(root.right, node)return parentdef lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':depth_p, depth_q = self.find_depth(root, p), self.find_depth(root, q)while depth_p > depth_q:p = self.find_parent(root, p)depth_p -= 1while depth_q > depth_p:q = self.find_parent(root, q)depth_q -= 1while q != p:p = self.find_parent(root, p)q = self.find_parent(root, q)return p

这篇关于记录一下最近遇到的几个二叉树的题型(附好用的遍历模板)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/713328

相关文章

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

解决JavaWeb-file.isDirectory()遇到的坑问题

《解决JavaWeb-file.isDirectory()遇到的坑问题》JavaWeb开发中,使用`file.isDirectory()`判断路径是否为文件夹时,需要特别注意:该方法只能判断已存在的文... 目录Jahttp://www.chinasem.cnvaWeb-file.isDirectory()遇

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

基于Java实现模板填充Word

《基于Java实现模板填充Word》这篇文章主要为大家详细介绍了如何用Java实现按产品经理提供的Word模板填充数据,并以word或pdf形式导出,有需要的小伙伴可以参考一下... Java实现按模板填充wor编程d本文讲解的需求是:我们需要把数据库中的某些数据按照 产品经理提供的 word模板,把数据

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤