二叉树遍历、查找、深度等

在面试中,二叉树问题是一个常见的主题。下面我将展示如何在 Python 3.11 中实现二叉树的基本结构和几种常见的面试题解法,包括二叉树的遍历、查找、深度等。

1. 二叉树节点的定义

class TreeNode:def __init__(self, value=0, left=None, right=None):self.value = valueself.left = left  # 左子节点self.right = right  # 右子节点

这个类定义了一个二叉树节点,其中每个节点包含一个值 (value) 和左右两个子节点 (leftright),默认值为 None

2. 二叉树的遍历

二叉树的遍历有多种方式,常见的有前序遍历中序遍历后序遍历。下面展示这三种方式的递归实现。

2.1 前序遍历(Pre-order: 根 -> 左 -> 右)
def preorder_traversal(root):if root is None:return []return [root.value] + preorder_traversal(root.left) + preorder_traversal(root.right)# 测试
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
print(preorder_traversal(root))  # 输出 [1, 2, 4, 5, 3]
2.2 中序遍历(In-order: 左 -> 根 -> 右)
def inorder_traversal(root):if root is None:return []return inorder_traversal(root.left) + [root.value] + inorder_traversal(root.right)# 测试
print(inorder_traversal(root))  # 输出 [4, 2, 5, 1, 3]
2.3 后序遍历(Post-order: 左 -> 右 -> 根)
def postorder_traversal(root):if root is None:return []return postorder_traversal(root.left) + postorder_traversal(root.right) + [root.value]# 测试
print(postorder_traversal(root))  # 输出 [4, 5, 2, 3, 1]

3. 二叉树的最大深度(高度)

这是一个常见的面试题,求二叉树的最大深度。

def max_depth(root):if root is None:return 0left_depth = max_depth(root.left)right_depth = max_depth(root.right)return max(left_depth, right_depth) + 1# 测试
print(max_depth(root))  # 输出 3

4. 二叉树是否是平衡二叉树

一个平衡二叉树定义为每个节点的左右子树的深度差不超过 1。

def is_balanced(root):def check_balance(node):if node is None:return 0, Trueleft_depth, left_balanced = check_balance(node.left)right_depth, right_balanced = check_balance(node.right)balanced = abs(left_depth - right_depth) <= 1 and left_balanced and right_balancedreturn max(left_depth, right_depth) + 1, balanced_, balanced = check_balance(root)return balanced# 测试
print(is_balanced(root))  # 输出 True

5. 二叉树的最低公共祖先(Lowest Common Ancestor, LCA)

给定二叉树的两个节点,找到它们的最低公共祖先节点。

def lowest_common_ancestor(root, p, q):if root is None or root == p or root == q:return rootleft = lowest_common_ancestor(root.left, p, q)right = lowest_common_ancestor(root.right, p, q)if left and right:return root  # 如果 p 和 q 分别在左右子树中,当前节点就是 LCAreturn left if left else right# 测试
p = root.left  # 节点 2
q = root.right  # 节点 3
print(lowest_common_ancestor(root, p, q).value)  # 输出 1

6. 二叉树的层序遍历(广度优先遍历)

层序遍历是按照每一层从左到右进行遍历,通常使用队列来实现。

from collections import dequedef level_order_traversal(root):if root is None:return []result = []queue = deque([root])while queue:level = []for _ in range(len(queue)):node = queue.popleft()level.append(node.value)if node.left:queue.append(node.left)if node.right:queue.append(node.right)result.append(level)return result# 测试
print(level_order_traversal(root))  # 输出 [[1], [2, 3], [4, 5]]

总结

以上是 Python 3.11 中关于二叉树的基本实现和一些常见的面试题。你可以根据具体的面试要求选择合适的算法,并根据问题的不同需求进行适当的优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/880096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot与minio

一、介绍 Minio是一个简单易用的云存储服务&#xff0c;它让你可以轻松地把文件上传到互联网上&#xff0c;这样无论你在哪里&#xff0c;只要有网络&#xff0c;就能访问或分享这些文件。如果你想要从这个仓库里取出一张图片或一段视频&#xff0c;让网站的访客能看到或者下载…

速盾:高防 CDN 怎么屏蔽恶意访问?

在当今网络环境中&#xff0c;恶意访问是网站和应用面临的一个严重问题。高防 CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;作为一种强大的防护工具&#xff0c;可以有效地屏蔽恶意访问&#xff0c;保护网站和应用的安全。那么&#xff0c;高…

How do you send files to the OpenAI API?

题意&#xff1a;你如何向 OpenAI API 发送文件 问题背景&#xff1a; For fun I wanted to try to make a tool to ask chatgpt to document rust files. I found an issue, in that the maximum message length the API allows seems to be 2048 characters. 为了好玩&…

【深度学习】(3)--损失函数

文章目录 损失函数一、L1Loss损失函数1. 定义2. 优缺点3. 应用 二、NLLLoss损失函数1. 定义与原理2. 优点与注意3. 应用 三、MSELoss损失函数1. 定义与原理2. 优点与注意3. 应用 四、BCELoss损失函数1. 定义与原理2. 优点与注意3. 应用 五、CrossEntropyLoss损失函数1. 定义与原…

K8S容器实例Pod安装curl-vim-telnet工具

在没有域名的情况下&#xff0c;有时候需要调试接口等需要此工具 安装curl、telnet、vim等 直接使用 apk add curlapk add vimapk add tennet

CMake 构建Qt程序弹出黑色控制台

CMake 构建Qt程序弹出黑色控制台

node - npm常用命令和package.json说明

NPM NPM 的全称是 Node Package Manager&#xff0c;是随同 NodeJS 一起安装的包管理和分发工具&#xff0c;它很方便让 JavaScript 开发者下载、安装、上传以及管理已经安装的包。 官网 npm 官网&#xff1a;https://www.npmjs.com npm 命令 命令说明npm init初始化一个新的…

mysql 内存被打满记录

一&#xff1a;早上收到报警&#xff1a;提示&#xff1a;您的云数据库RDS的1个实例因存储空间满将被锁定&#xff0c;请关注实例的存储空间使用情况&#xff0c;可通过存储扩容或空间清理解除锁定。后续查看错误日志如下&#xff1a;磁盘没有空间了 没有多余的空间写binlog和…

STM32 单片机最小系统全解析

STM32 单片机最小系统全解析 本文详细介绍了 STM32 单片机最小系统&#xff0c;包括其各个组成部分及设计要点与注意事项。STM32 最小系统在嵌入式开发中至关重要&#xff0c;由电源、时钟、复位、调试接口和启动电路等组成。 在电源电路方面&#xff0c;采用 3.3V 直流电源供…

Golang | Leetcode Golang题解之第417题太平洋大西洋水流问题

题目&#xff1a; 题解&#xff1a; type pair struct{ x, y int } var dirs []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}func pacificAtlantic(heights [][]int) (ans [][]int) {m, n : len(heights), len(heights[0])pacific : make([][]bool, m)atlantic : make([][]bool, …

AttributeError: ‘Sequential‘ object has no attribute ‘predict_classes‘如何解决

今天跟着书敲代码&#xff0c;报错&#xff1a; Sequential object has no attribute predict_classes&#xff0c;如图所示&#xff1a; 上网百度&#xff0c;发现predict_classes函数在新版本中已经删除了&#xff0c;需要使用 model.predict() 替代 model.predict_classes()…

基于springboot+vue超市管理系统

基于springbootvue超市管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本无人超市管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在…

AI运动小程序开发常见问题集锦一

截止到现在写博文时&#xff0c;我们的AI运动识别小程序插件已经迭代了23个版本&#xff0c;成功应用于健身、体育、体测、AR互动等场景&#xff1b;为了让正在集成或者计划进行功能扩展优化的用户&#xff0c;少走弯路、投入更少的开发资源&#xff0c;我们归集了一部分集中的…

统信服务器操作系统ade版【iostat】命令详解

统信服务器操作系统全版本iostat 安装、命令格式和命令参数 文章目录 功能概述功能介绍1.iostat安装2.iostat命令格式3.iostat命令参数 功能概述 iostat主要用与报告CPU统计信息和设备分区的io统计信息&#xff0c;iostat首次运行时显示自系统启动开始的各项统计信息&#xff…

vben admin vue后端权限控制登录失效后,vben admin获取登录过期信息并注销登录返回登录页

登录失效后&#xff0c;后端拦截器拦截并跳转到登录失效方法&#xff0c;该方法返回对应的code编码&#xff0c;如果报错跨域&#xff0c;加上跨域注解CrossOrigin ResponseBodyCrossOrigin //目标方法上加入这个解决跨域RequestMapping(value { "/tokentimeout"}…

IEEE Electronic Library(IEL)数据库文献检索下载介绍及个人获取IEEE文献途径

一、数据库介绍 IEEE&#xff08;The Institute of Electrical and Electronics Engineers&#xff0c;电气电子工程师学会&#xff09;是目前全球最大的非营利性专业技术学会&#xff0c;在全球160多个国家拥有超过45万名会员。IEEE在电气电子、计算机、半导体、通讯、电力能…

【Unity踩坑】UI Image的fillAmount不起作用

在游戏场景中&#xff0c;我们经常在界面上展示进度条&#xff0c;当然有各种形状的&#xff0c;线性的&#xff0c;长方形的&#xff0c;圆形&#xff0c;环形等等。 Unity中实现这种效果的话&#xff0c;最基本的方法说是改变Image的fillAmout属性。 如果你是初次使用UI Ima…

浅显易懂的Git教程

Git概述 SVN与Git的对比 SVN&#xff08;Subversion&#xff09; 类型&#xff1a;集中式版本控制系统 工作流程&#xff1a; 从中央服务器下载最新版本到本地。在本地进行开发。提交更改回中央服务器。 优点&#xff1a; 简单易用&#xff0c;适合小型团队。版本历史清…

VMware vSphere 8.0 Update 3b 发布下载,新增功能概览

VMware vSphere 8.0 Update 3b 发布下载&#xff0c;新增功能概览 vSphere 8.0U3 | ESXi 8.0U3 & vCenter Server 8.0U3 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vsphere-8-u3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页…

Matlab基础练习

题目&#xff1a;计算the day of year&#xff08;年积日&#xff09;&#xff0c;the day of year 是指这一年已经逝去的天数&#xff08;包括当天&#xff09;。在平年中&#xff0c;它的取值范围为1到365&#xff0c;在闰年中&#xff0c;它的取值范围1 到366。 year inpu…