二叉树的基本操作实现包括创建二叉树、插入节点、搜索节点、删除节点、遍历二叉树等详解

二叉树的基本操作主要包括创建二叉树、插入节点、搜索节点、删除节点、遍历二叉树等。下面是这些基本操作的 Python 代码实现。

  1. 创建二叉树
class TreeNode:def __init__(self, value):self.value = valueself.left = Noneself.right = Noneclass BinaryTree:def __init__(self):self.root = None
  1. 插入节点
class BinaryTree:def insert(self, value):if self.root is None:self.root = TreeNode(value)else:self._insert(value, self.root)def _insert(self, value, node):if value < node.value:if node.left is None:node.left = TreeNode(value)else:self._insert(value, node.left)else:if node.right is None:node.right = TreeNode(value)else:self._insert(value, node.right)
  1. 搜索节点
class BinaryTree:def search(self, value):return self._search(value, self.root)def _search(self, value, node):if node is None:return Falseif value == node.value:return Trueelif value < node.value:return self._search(value, node.left)else:return self._search(value, node.right)
  1. 删除节点(略复杂,需要判断多种情况)
  2. 遍历二叉树(三种遍历方式:前序遍历、中序遍历、后序遍历)

前序遍历:根节点 -> 左子树 -> 右子树

中序遍历:左子树 -> 根节点 -> 右子树

后序遍历:左子树 -> 右子树 -> 根节点

以下是二叉树删除节点和三种遍历方式的Python代码实现:

  1. 删除节点
class BinaryTree:def delete(self, value):self.root = self._delete(value, self.root)def _delete(self, value, node):if node is None:return nodeif value < node.value:node.left = self._delete(value, node.left)elif value > node.value:node.right = self._delete(value, node.right)else:if node.left is None:return node.rightelif node.right is None:return node.leftelse:min_node = self._find_min(node.right)node.value = min_node.valuenode.right = self._delete(min_node.value, node.right)return nodedef _find_min(self, node):current = nodewhile current.left is not None:current = current.leftreturn current
  1. 前序遍历
class BinaryTree:def preorder_traversal(self):self._preorder_traversal(self.root)def _preorder_traversal(self, node):if node is not None:print(node.value)self._preorder_traversal(node.left)self._preorder_traversal(node.right)
  1. 中序遍历
class BinaryTree:def inorder_traversal(self):self._inorder_traversal(self.root)def _inorder_traversal(self, node):if node is not None:self._inorder_traversal(node.left)print(node.value)self._inorder_traversal(node.right)
  1. 后序遍历

后序遍历有点不同,因为它首先遍历左右子树,然后访问根节点。可以使用递归或迭代方式实现。以下是递归方式的代码实现:

class BinaryTree:def postorder_traversal(self):self._postorder_traversal(self.root)def _postorder_traversal(self, node):if node is not None:self._postorder_traversal(node.left)self._postorder_traversal(node.right)print(node.value)

以下是后序遍历的代码实现,采用递归方式:

class BinaryTree:def postorder_traversal(self):self._postorder_traversal(self.root)def _postorder_traversal(self, node):if node is not None:self._postorder_traversal(node.left)self._postorder_traversal(node.right)print(node.value)

以上代码实现了二叉树的基本操作,包括创建二叉树、插入节点、搜索节点、删除节点以及三种遍历方式。使用这些基本操作可以构建出各种复杂的二叉树算法和应用。

除了上面提到的基本操作,还有一些其他的常见操作,比如计算二叉树的高度、检查二叉树是否为二叉搜索树等。以下是这些操作的代码实现:

  1. 计算二叉树的高度
class BinaryTree:def height(self):return self._height(self.root)def _height(self, node):if node is None:return 0else:left_height = self._height(node.left)right_height = self._height(node.right)return max(left_height, right_height) + 1
  1. 检查二叉树是否为二叉搜索树
class BinaryTree:def is_bst(self):return self._is_bst(self.root, float('-inf'), float('inf'))def _is_bst(self, node, min_value, max_value):if node is None:return Trueif node.value <= min_value or node.value >= max_value:return Falsereturn self._is_bst(node.left, min_value, node.value) and self._is_bst(node.right, node.value, max_value)

这些操作可以进一步扩展二叉树的功能和应用。根据具体需求,还可以实现其他的自定义操作。

除了上述提到的基本操作和功能,还有一些更高级的操作,例如寻找二叉树中的第K个最小值、检查二叉树是否平衡等。以下是这些操作的代码实现:

  1. 寻找二叉树中的第K个最小值
class BinaryTree:def kth_smallest(self, k):return self._kth_smallest(self.root, k)def _kth_smallest(self, node, k):if node is None:return Noneleft_result = self._kth_smallest(node.left, k)if left_result is not None:return left_resultk -= 1if k == 0:return node.valuereturn self._kth_smallest(node.right, k)
  1. 检查二叉树是否平衡
class BinaryTree:def is_balanced(self):return self._is_balanced(self.root)def _is_balanced(self, node):if node is None:return Trueleft_height = self._height(node.left)right_height = self._height(node.right)if abs(left_height - right_height) > 1:return Falsereturn self._is_balanced(node.left) and self._is_balanced(node.right)

这些操作可以进一步提升二叉树操作的复杂性和实用性。根据具体的应用场景,还可以设计更多的操作和算法。

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

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

相关文章

honle电源维修UV电源控制器EVG EPS40C-HMI

好乐UV电源控制器维修&#xff1b;honle控制器维修&#xff1b;UV电源维修MUC-Steuermodul 2 LΛmpen D-82166 主要维修型号&#xff1a; EVG EPS 60/120、EVG EPS 100、EVG EPS200、EVG EPS 220、EVG EPS 340、EVG EPS40C-HMI、EVG EPS60 HONLE好乐uv电源维修故障包括&#…

localhost和127.0.0.1在以下四个方面存在区别

localhost和127.0.0.1在以下四个方面存在区别&#xff1a; 原理&#xff1a;localhost的原理是不经网卡传输&#xff0c;不会受到网卡协议的限制。而127.0.0.1则是经过网卡传输&#xff0c;依赖网卡协议&#xff0c;并受到网卡相关协议的限制。概念&#xff1a;localhost&…

申请开通QMT量化需要多少资金?免费开通!

最近量化交易在市场上大火&#xff0c;很多投资者想要参与进来。QMT量化软件是目前市场上一款比较常见并且强大的量化软件。那开通QMT量化交易软件需要多少资金&#xff1f; QMT量化交易软件是一种专门用于量化交易的工具&#xff0c;它能够帮助投资者通过程序化交易策略进行股…

如何解决“该公众号提供的服务出现故障,请稍后再试”

出现“该公众号提供的服务出现故障&#xff0c;请稍后再试” &#xff0c; 或者是出现 “公众号接口出现异常&#xff0c;请加入微信群接收接口报警” 的提问&#xff0c; 出现这个一般是开发者自身服务器出现问题导致的。 本文我来教大家如何排查。 第一步&#xff1a;加入告…

【力扣周赛】第 115 场双周赛(⭐优化背包DP)(TODO)

文章目录 竞赛链接Q1&#xff1a;2899. 上一个遍历的整数&#x1f4a9;&#xff08;阅读理解题&#xff0c;按题意模拟&#xff09;Q2&#xff1a;2900. 最长相邻不相等子序列 I&#xff08;贪心&#xff09;Q3&#xff1a;2901. 最长相邻不相等子序列 II&#xff08;类似 最长…

算法通关村第一关—白银挑战—链表高频面试算法题—查找两个链表的第一个公共子节点

文章目录 查找两个链表的第一个公共子节点&#xff08;1&#xff09;暴力求解法&#xff08;2&#xff09;使用哈希Hash⭐&#xff08;3&#xff09;使用集合⭐ - 与Hash类似&#xff08;4&#xff09;使用栈⭐&#xff08;5&#xff09;仍有更多方法&#xff0c;作者尚未理解&…

【小布_ORACLE笔记】Part11-1--RMAN Backups

Oracle的数据备份于恢复RMAN Backups 学习第11章需要掌握&#xff1a; 一.RMAN的备份类型 二.使用backup命令创建备份集 三.创建备份文件 四.备份归档日志文件 五.使用RMAN的copy命令创建镜像拷贝 文章目录 Oracle的数据备份于恢复RMAN Backups1.RMAN Backup Concepts&#x…

LeetCode | 965. 单值二叉树

LeetCode | 965. 单值二叉树 OJ链接 首先判断树为不为空&#xff0c;为空直接true然后判断左子树的val&#xff0c;和根的val相不相同再判断右子树的val&#xff0c;和根的val相不相同最后递归左子树和右子树 bool isUnivalTree(struct TreeNode* root) {if(root NULL)retur…

Python解释器的安装【侯小啾python领航班系列(一)】

Python解释器的安装【侯小啾python领航班系列(一)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

深入Spring Security魔幻山谷-获取认证机制核心原理讲解(新版)

文/朱季谦 这是一个古老的传说。 在神秘的Web系统世界里&#xff0c;有一座名为Spring Security的山谷&#xff0c;它高耸入云&#xff0c;蔓延千里&#xff0c;鸟飞不过&#xff0c;兽攀不了。这座山谷只有一条逼仄的道路可通。然而&#xff0c;若要通过这条道路前往另一头的…

Vue + Element ui 实现动态表单,包括新增行/删除行/动态表单验证/提交功能

原创/朱季谦 最近通过Vue Element ui实现了动态表单功能&#xff0c;该功能还包括了动态表单新增行、删除行、动态表单验证、动态表单提交功能&#xff0c;趁热打铁&#xff0c;将开发心得记录下来&#xff0c;方便以后再遇到类似功能时&#xff0c;直接拿来应用。 简化的页…

zabbix6.4.0配置邮件及企微机器人群聊告警

一、邮件告警 根据公司邮箱自行配置&#xff0c;电子邮件、用户账号密码填自己的邮箱账号密码 动作本次使用的默认的&#xff0c;如果为了更加美观可自行修改。 二、企业微信机器人告警 首先在企微上创建群聊&#xff0c;之后添加群聊机器人 将地址复制&#xff0c;后面用 …

【完整项目】基于Python+Tkinter+OpenCV+Yolo+手写OCR的双模式答题卡识别软件的设计与实现

目录 前言软件展示一、软件使用说明1.1 环境配置1.2 文件结构1.3 准备工作二、快速开始三、实现思路3.1 项目流程图3.2 界面设计3.3 核心设计3.3.1 模板制作3.3.2 识别算法基于传统图像处理的算法基于深度学习的算法3.3.3

MATLAB 模型参考自适应控制 - Model Reference Adaptive Control

系列文章目录 文章目录 系列文章目录前言一、参考模型二、扰动与不确定性模型三、直接 MRAC名义模型参数更新间接 MRAC估计器模型和控制器增益参数更新学习修正参考文献 前言 模型参考自适应控制模块计算控制动作&#xff0c;使不确定的受控系统跟踪给定参考被控对象模型的行为…

【LeetCode刷题笔记】102. 二叉树的层序遍历

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

kkFileView 从源码编译最新安装包

目录 一、前言二、拉取 kkFileView 最新代码三、kkFileView 打包 一、前言 kkFileView 是一个开源的附件在线预览项目&#xff0c;可以让你的项目方便的在线预览附件&#xff0c;包括比如&#xff1a;doc、docx、pdf、xml、xls、xlsx、ppt、pptx、zip、png、jpg、txt、mp4等常…

测评补单助力亚马逊,速卖通,国际站卖家抢占市场,提升转化和评分

想要快速提升商品的销量&#xff0c;测评补单这种方法见效是最快的。特别是新品上线&#xff0c;缺少用户评价&#xff0c;转化率不好&#xff0c;很多商家新品上线都会做测评补单&#xff0c;搞些商品好评&#xff0c;不但可以提升转化&#xff0c;同时在平台也可以获得更多展…

基于若依的ruoyi-nbcio流程管理系统仿钉钉流程初步完成转bpmn设计(还有bug,以后再修改)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 今天初步完成仿钉钉流程转bpmn设计的工作&#xff0c;当然还有不少bug&#xff0c;以后有需要或者网友也帮…

1094. 拼车 --力扣 --JAVA

题目 车上最初有 capacity 个空座位。车 只能 向一个方向行驶&#xff08;也就是说&#xff0c;不允许掉头或改变方向&#xff09; 给定整数 capacity 和一个数组 trips , trip[i] [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客&#xff0c;接他们和放…

:deep(){} 样式穿透不生效问题解决方案

在我们写vue的项目的时候&#xff0c;可能会遇到这种情况&#xff0c;父子组件&#xff0c;在父组件中使用了样式穿透给子组件的类添加样式&#xff0c;结果失败了。比如下面这种情况。 父组件 <template><p>我是父组件</p><Son /> </template>…