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

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

离散型制造业MES系统主要功能介绍

一、离散型制造业的特点 离散型制造业是指生产过程中涉及多个独立工序或步骤&#xff0c;且这些工序之间相对独立、缺乏连续性的企业。其特点主要包括&#xff1a; 产品种类多&#xff0c;开发频繁&#xff1a; 离散型制造业通常需要进行多品种产品开发&#xff0c;产品种类繁…

OpenCV特征检测(2)边缘检测函数Canny()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用 Canny 算法 48在图像中查找边缘。 该函数使用 Canny 算法在输入图像中查找边缘&#xff0c;并在输出地图 edges 中标记它们。在 threshold1…

微服务架构---Ribbon\Feign

Ribbon(负载均衡) Ribbon概述 在 SpringCloud 中&#xff0c; Nacos⼀般配合Ribbon进行使用&#xff0c;Ribbon提供了客户端负载均衡的功能&#xff0c;Ribbon利用从Nacos中读取到的服务信息&#xff0c;在调用服务节点提供的服务时&#xff0c;会合理的进行负载。 Ribbon作…

Java内部类一口气讲完!( •̀ ω •́ )✧

Java 内部类 Java面向对象的设计 - Java 内部类 什么是内部类&#xff1f; 作为包的成员的类被称为顶级类。 一个类可以在另一个类中声明。这种类型的类称为内部类。 如果在另一个类中声明的类被显式或隐式声明为static&#xff0c;它被称为嵌套类&#xff0c;而不是内部类…

Apache Flink 流批融合技术介绍

摘要&#xff1a;本文整理自阿里云高级研发工程师、Apache Flink Contributor 周云峰老师在 Apache Asia CommunityOverCode 2024中的分享。内容主要分为以下三个部分&#xff1a; 从流批一体到流批融合流批融合的技术解决方案社区进展及未来展望 一、从流批一体到流批融合 1&…

音视频开发之旅(95)-基于多模态的画质评测算法Q-Align

目录 1.背景与问题 2.人工MOS评测的过程 3.评分等级与评分的转换 4.构建对话式指令数据集 5.Q-ALIGN模型结构 6.实验结果 7.源码分析 8.资料 一、背景和问题 多模态模型&#xff08;LMMs&#xff09;在视觉和语言方面展现出非常强大的能力&#xff0c;它们能够很好地理…

【数据结构】假设二叉树采用二叉链表存储,编写一棵二又树中序遍历的非递归算法。

编程题&#xff1a; 假设二叉树采用二叉链表存储&#xff0c;编写一棵二又树中序遍历的非递归算法。 分析&#xff1a; 算法描述&#xff1a; 非递归中序遍历二叉树的算法使用栈来辅助实现。首先&#xff0c;从根节点开始&#xff0c;沿着左子树不断向下&#xff0c; 将每个节…

DataFrame生成excel后为什么多了一行数字

问题描述 python查询数据生成excel文件&#xff0c;生成的excel多了第一行数字索引&#xff0c;1,2,3,4,5...... 代码&#xff1a; df pd.DataFrame(data)df.to_excel(filename, sheet_name用户信息表, indexFalse) 解决&#xff1a; 原理也很简单&#xff0c;就是设置个参…

MCS-51汇编

伪指令&#xff1a; EQU: Equal&#xff0c;定义常量 COUNT EQU 10H ; 定义一个符号名COUNT&#xff0c;其值为10H DELAY EQU 500 ; 定义一个符号名DELAY&#xff0c;其值为500 数据传送&#xff1a; MOV: MOVE&#xff0c;传送数据 MOVC: 算术运算&#xff1a; 跳转…

开源 AI 智能名片 S2B2C 商城小程序与正能量融入对社群归属感的影响

摘要&#xff1a;本文探讨了开源 AI 智能名片 S2B2C 商城小程序在社群运营中的作用&#xff0c;以及融入正能量对提高社群归属感的关键意义。通过分析正能量的精神感染力和对社群氛围的积极影响&#xff0c;阐述了在开源 AI 智能名片 S2B2C 商城小程序的各类活动中融入正能量的…

数据结构之线性表——LeetCode:707. 设计链表,206. 反转链表,92. 反转链表 II

707. 设计链表 题目描述 707. 设计链表 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则…

【经验技巧】IBIS AMI模型眼图仿真问题探讨

最近&#xff0c;有同事问我&#xff1a;“拿到供应商的IBIS AMI模型&#xff0c;怎么判断是否可以进行应力&#xff08;统计&#xff09;眼图的仿真呀&#xff1f;如果不能进行&#xff0c;又怎么判断结果是瞬态仿真呢&#xff1f;” 不得不说&#xff0c;这的确是一个不错的话…

2024秋面向对象程序设计pta-实验二

6-1 设计一个矩形类Rectangle class Rectangle{ double width1; double height 1; public Rectangle(){} public Rectangle(double width, double height){ this.widthwidth; this.heightheight;} public double getArea(){ return width*height;} public double getPerimete…

en造数据结构与算法C# 用Unity实现简单的群组行为算法 之 对齐

en造数据结构与算法C# 用Unity实现简单的群组行为算法 之 聚集-CSDN博客 en造数据结构与算法C# 用Unity实现简单的群组行为算法 之 聚集-CSDN博客 演示 思路 1.检测 自然是沿用前两节的检测范围 2.对齐朝向 对齐朝向就是邻居鸟的forward加起来再除总数得到平均数 3.对齐…

3657A/B/AM/BM矢量网络分析仪

苏州新利通 3657A/B/AM/BM 矢量网络分析仪 3657系列矢量网络分析仪适用于无线通信、有线电视、教育及汽车电子等领域&#xff0c;可用于对滤波器、放大器、天线、电缆、有线电视分接头等射频元件的性能测量。该产品采用Windows操作系统&#xff1b;具有误差校准功能、时域功能…

MySQL中的LIMIT与ORDER BY关键字详解

前言 众所周知&#xff0c;LIMIT和ORDER BY在数据库中&#xff0c;是两个非常关键并且经常一起使用的SQL语句部分&#xff0c;它们在数据处理和分页展示方面发挥着重要作用。 今天就结合工作中遇到的实际问题&#xff0c;回顾一下这块的知识点。同时希望这篇文章可以帮助到正…

How can I stream a response from LangChain‘s OpenAI using Flask API?

题意&#xff1a;怎样在 Flask API 中使用 LangChain 的 OpenAI 模型流式传输响应 问题背景&#xff1a; I am using Python Flask app for chat over data. In the console I am getting streamable response directly from the OpenAI since I can enable streming with a f…

JZ2440开发板——S3C2440的UART

以下内容源于韦东山课程的学习与整理&#xff0c;如有侵权请告知删除。 一、UART硬件简介 UART&#xff0c;全称是“Universal Asynchronous Receiver Transmitter”&#xff0c;即“通用异步收发器”&#xff0c;也就是我们日常说的“串口”。 它在嵌入式中用途非常广泛&…

一文彻底让你搞懂轨迹规划(总结)

机器人在运行中不可避免的会进行运动&#xff0c;那么就会产生出轨迹规划的概念。 轨迹规划的特点&#xff1a;用一定的函数形式表示控制量&#xff08;位置&#xff0c;速度&#xff0c;加速度&#xff09;的控制律&#xff0c;根据约束或最优目标&#xff0c;求取控制控制参…

STM32固件库介绍

CMSIS标准介绍 早期的标准库叫STD 不管是hal库还是标准库都是封好库然后给我们使用的 标准库可能兼容不了F1 F4 F7 但是用HAL库就能够兼容那么多 我们可以用cubex来配置一个工程 固件库文件夹介绍 CMSIS的启动文件&#xff0c;RTOS实时操作系统文件 外设驱动文件 Inc外设的头…