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

server/2024/9/24 15:34:21/

在面试中,二叉树问题是一个常见的主题。下面我将展示如何在 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.ppmy.cn/server/121403.html

相关文章

文献笔记 - Reinforcement Learning for UAV Attitude Control

这篇博文是自己看文章顺手做的笔记 只是简单翻译和整理 仅做个人参考学习和分享 如果作者看到觉得内容不妥请联系我 我会及时处理 本人非文章作者&#xff0c;文献的引用格式如下&#xff0c;原文更有价值 Koch W, Mancuso R, West R, et al. Reinforcement learning for UA…

SpringBoot+Aop+注解方式 实现多数据源动态切换

整体思路&#xff1a; 引入基本依赖SpringBootAopMySqlMyBatislombok在配置文件中配置多个数据源创建数据源配置类用于读取配置编写用于标识切换数据源的注解创建数据源切换工具类DataSourceContextHolder编写切面类用于在注解生效处切换数据源编写配置类&#xff0c;加载数据…

【截稿更新 | 11月杭州 | EI稳定 】

【截稿更新 | 11月杭州 | EI稳定 】2024年人机交互与虚拟现实国际会议&#xff08;HCIVR 2024&#xff09; ✅会议时间&#xff1a;2024年11月15-17日 ✅会议地点&#xff1a;中国杭州 &#x1f525;二轮截稿日期&#xff1a;2024年10月15日 &#x1f308;投稿通道已开启&#…

在一个.NET Core项目中使用RabbitMQ进行即时消息管理

为了在一个.NET Core项目中使用RabbitMQ进行即时消息管理&#xff0c;以下是详细的全程操作指南&#xff0c;包括安装、配置、编写代码和调试使用。 一、安装RabbitMQ 1. 安装Erlang RabbitMQ依赖Erlang&#xff0c;因此需要先安装Erlang。 Windows: 下载并运行Erlang安装…

切换笔记本键盘的启用与禁用状态

使用批处理脚本切换笔记本键盘的启用与禁用状态 背景描述详细步骤及代码解释1. 在管理员模式下运行脚本2. 脚本内容3. 解释 背景描述 在笔记本电脑中&#xff0c;在外接键盘的时候&#xff0c;有时我们希望禁用内置键盘&#xff0c;防止意外按键。Windows 系统中&#xff0c;键…

爬虫的流程

爬虫的流程 获取网页提取信息保存数据自动化程序能爬怎样的数据 获取网页 获取网页就是获取网页的源代码&#xff0c;源代码里包含了网页的部分有用信息&#xff0c;所以只要把源代码获取下来&#xff0c;就可以从中提取想要的信息浏览器访问网页的本质&#xff1a;浏览器向服…

微服务--Gateway网关

在微服务架构中&#xff0c;Gateway&#xff08;网关&#xff09;是一个至关重要的组件&#xff0c;它扮演着多种关键角色&#xff0c;包括路由、负载均衡、安全控制、监控和日志记录等。 Gateway网关的作用 统一访问入口&#xff1a; Gateway作为微服务的统一入口&#xff0c…

鸿蒙HarmonyOS开发:一次开发,多端部署(界面级)天气应用案例

文章目录 一、布局简介二、典型布局场景三、侧边栏 SideBarContainer1、子组件2、属性3、事件 四、案例 天气应用1、UX设计2、实现分析3、主页整体实现4、具体代码 五、运行效果 一、布局简介 布局可以分为自适应布局和响应式布局&#xff0c;二者的介绍如下表所示。 名称简介…