【Python数据结构】——二叉查找树(查找、构建、删除、插入、打印)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/7/15 0:34
# @Author  : @linlianqin
# @Site    : 
# @File    : 二叉查找树类实现(查找、创建、删除、插入、遍历).py
# @Software: PyCharm
# @description:class TreeNode:def __init__(self, val, left=None, right=None):self.val = valself.left = leftself.right = rightclass BST_operation:# 二叉查找数元素查找# 思路:根据二叉查找树的左小右大的特性,当当前结点值大于target则说明值在左子树,否则在右子树def BST_search(self,root, target):# 当访问到最后得到的是None,说明元素不存在查找树上if root == None:return False# 当当前结点值等于target时查找成功if root.val == target:return True# 当结点值小于target时,说明目标有可能存在右子树elif root.val < target:return self.BST_search(root.right, target)# 当结点值小于target时,说明目标有可能存在右子树if root.val > target:return self.BST_search(root.left, target)# 二叉查找数元素插入# 思路:根据二叉查找树的左小右大的特性,当当前结点值大于target则说明值插入到,否则在右子树# 当root == None时,说明就是插入的位置def BST_insert(self,root, target):# 当值为None,创建新结点if root == None:root = TreeNode(target)# 存在时elif root.val == target:passelif root.val < target:root.right = self.BST_insert(root.right, target)elif root.val > target:root.left = self.BST_insert(root.left, target)return root# 二叉查找树构建# 根据列表进行二叉查找数的建立# 思路:新建一个None结点作为初始头结点,然后进行后面元素的插入def BST_create(self,li):if len(li) != 0:root = TreeNode(li[0])else:return Nonefor i in range(1, len(li)):self.BST_insert(root, li[i])return root# 二叉查找树的删除# 删除根节点的处理方法,为了保证删除根节点后依旧是一颗完整的二叉查找树,这里可以用左子树中的最大值和右子树中的最小值来代替根节点,然后在子树中删除相应的叶节点# 1)若root值为None,说明二叉树中不存在要删除的值# 2)若root值刚好是target,说明已经找到了要删除的结点,进行删除处理操作:# a) 如果root没有左右子树了,直接删除结点即可# b)如果root还有左子树,则寻找左子树中的最大值,用于替换root,然后在左子树中删除结点# c) 如果root还有右子树,则寻找右子树的最小树,用于替换root,然后在右子树中删除结点# 3)如果root值大于target,target可能在左子树,递归# 4)如果root值小于target,target可能在右子树,递归## 寻找二叉查找树以root为根节点的最小权值def BST_search_min(self,root):if root.left:return self.BST_search_min(root.left)else:return root## 寻找二叉查找树以root为根节点的最大权值def BST_search_max(self,root):if root.right:return self.BST_search_max(root.right)else:return root## 删除def BST_delete(self,root, target):# todo:这里可选# 1)若root值为None,说明二叉树中不存在要删除的值if root.val == None:return# 2)如果root值大于target,target可能在左子树,递归elif root.val > target:root.left = self.BST_delete(root.left, target)# 3)如果root值小于target,target可能在右子树,递归elif root.val < target:root.right = self.BST_delete(root.right, target)# 4)若root值刚好是target,说明已经找到了要删除的结点,进行删除处理操作:if root.val == target:# a) 如果root没有左右子树了,直接删除结点即可if root.left is None and root.right is None:root = None# b)如果root还有左子树,则寻找左子树中的最大值,用于替换root,然后在左子树中删除结点elif root.left is not None:root = root.left# c) 如果root还有右子树,则寻找右子树的最小树,用于替换root,然后在右子树中删除结点elif root.right is not None:root = root.rightreturn root# 遍历二叉查找数,中序遍历def BST_mid_scan(self,root):if root is None:return# 遍历左子树self.BST_mid_scan(root.left)# 遍历根节点print(root.val, end=',')self.BST_mid_scan(root.right)if __name__ == '__main__':li = [5,3,7,4,2,8,6]print('li:',li)BST = BST_operation()print('构建二叉查找树--------------------')root = BST.BST_create(li)BST.BST_mid_scan(root)# 插入print("\n插入1--------------------------")BST.BST_insert(root,1)BST.BST_mid_scan(root)# 删除print("\n删除6----------------------")BST.BST_delete(root,6)BST.BST_mid_scan(root)# 查找print("\n查找--------------------------------")print("在二叉树中查找10:",BST.BST_search(root,10))print("在二叉树中查找5:",BST.BST_search(root,5))

li: [5, 3, 7, 4, 2, 8, 6]
构建二叉查找树--------------------
2,3,4,5,6,7,8,
插入1--------------------------
1,2,3,4,5,6,7,8,
删除6----------------------
1,2,3,4,5,7,8,
查找--------------------------------
在二叉树中查找10: False
在二叉树中查找5: True

参考:

https://blog.csdn.net/ca___0/article/details/111385872

https://blog.csdn.net/u010089444/article/details/70854510

胡凡——算法笔记

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

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

相关文章

ABB RAPID SOCKET编程

相传在2009年6月11日&#xff0c;微博的鼻祖t-w-i-t-t-e-r还没有被封锁的时候&#xff0c;于仁颇黎写了了一个东西可以将staubli机器人在运行时的状态&#xff0c;实时发送上去&#xff0c;可以被实时的查看&#xff0c;任何一个人都可以查看&#xff0c;于是就有了这个名为TWI…

Plupload文件上传组件使用API

Plupload有以下功能和特点&#xff1a; 1、拥有多种上传方式&#xff1a;HTML5、flash、silverlight以及传统的<input type”file” />。Plupload会自动侦测当前的环境&#xff0c;选择最合适的上传方式&#xff0c;并且会优先使用HTML5的方式。所以你完全不用去操心当前…

广告主产品推词中的NLP

加词&#xff0c;加产品&#xff0c;调价是广告主的核心问题&#xff0c;为了解决广告主加词的问题在阿里巴巴以及速卖通的账户后台提供了加词利器——先知&#xff0c;一键解决广告主烦恼&#xff0c;从此不再为加词而忧愁。一 引言 在目前付费搜索引擎中&#xff0c;买词和竞…

Android 动态设置 layout_centerInParent

RelativeLayout.LayoutParams rp new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);rp.addRule(RelativeLayout.CENTER_IN_PARENT);记录一下转载于:https://www.cnblogs.com/IWings/p/6097134.html

tidevice.exceptions.MuxServiceError: Could not start service: com.apple.testmanagerd.lockdown.secure

错误是在进行利用pycharm IDE和airtest框架进行苹果手机自动化测试遇到的 错误具体如下 [I 210715 10:32:34 _device:572] ProductVersion: 14.6 [I 210715 10:32:34 _device:551] Download https://tool.appetizer.io/iGhibli/iOS-DeviceSupport/raw/master/DeviceSupport/14…

机器人 工具坐标系的标定

概念 工具坐标系是把机器人腕部法兰盘所握工具的有效方向定为Z轴&#xff0c;把坐标定义在工具尖端点&#xff0c;所以工具坐标的方向随腕部的移动而发生变化。 工具坐标的移动&#xff0c;以工具的有效方向为基准&#xff0c;与机器人的位置、姿势无关&#xff0c;所以进行相…

Linux内核分析— —计算机是如何工作的(20135213林涵锦)

实验部分 &#xff08;以下命令为实验楼64位Linux虚拟机环境下适用&#xff0c;32位Linux环境可能会稍有不同&#xff09; 使用 gcc –S –o main.s main.c -m32命令编译成汇编代码&#xff0c; int g(int x){ return x 6;} int f(int x){ return g(x);} int main(void){ r…

apache域名跳转

①编辑虚拟主机配置文件/usr/local/apache2.4/conf/extra/httpd-vhosts.conf如下<VirtualHost *:80>DocumentRoot "/data/wwwroot/111.com"ServerName 111.comServerAlias www.example.com 2111.com.cnErrorLog "logs/111.com-error_log"CustomLog …

php 画图片2

<?php// 使用php操作gd库做图// 1. 创建一个画布资源$im imagecreatetruecolor(200, 50);// 2. 创建背景色// 2.1 得到背景颜色$bg_color imagecolorallocate($im, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));// 2.2 填充画布imagefill($im, 0, 0, $bg_c…

ABB机器人ROBOTSTUDIO中轨迹与二次开发的问答

问&#xff1a; 在视频学习里&#xff0c;robotstudio可以提取物体的某条轮廓来直接生成路径。请问&#xff0c;1.如果要提取的是模型两边的中心线&#xff0c;也能直接生成路径吗&#xff1f;2.robotstudio有二次开发的功能吗&#xff0c;比如对数据进行运算。我也不知道我说的…

【Python数据结构】——二叉平衡树AVL(查找、构建、删除、插入、打印、遍历)

#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/7/28 20:57 # Author : linlianqin # Site : # File : 二叉平衡树专题&#xff08;创建、插入、查找&#xff09;.py # Software: PyCharm # description:二叉平衡树的特点&#xff1a;在二叉查找树的…

随笔速记

LVM增加与缩小Swap分区操作 http://blog.sina.com.cn/s/blog_5f2ca1ed0101ebw8.html Ubuntu删除多余内核 # dpkg --get-selections | grep linux # apt-get purge linux-headers-3.0.0-12 linux-image-3.0.0-12-generic # update-grub Ubuntu清理安装包、已卸载软件、已卸载软件…

【测试开发】测试用例讲解

文章目录 目录 文章目录 前言 一、测试用例的基本要素 二、测试用例的设计方法 1.基于需求的设计方法 对日历根据web界面的功能布局分析出的功能框图如下&#xff1a; 继续举一个例子百度云盘非功能测试的案例&#xff1a; 2.等价类 3.边界值 5.正交表 6.场景设计法 7…

Linux下进行Web服务器压力(并发)测试工具http_load、webbench、ab、Siege、autobench简单使用教程(转)...

一、http_load 程序非常小&#xff0c;解压后也不到100K http_load以并行复用的方式运行&#xff0c;用以测试web服务器的吞吐量与负载。但是它不同于大多数压力测试工 具&#xff0c;它可以以一个单一的进程运行&#xff0c;一般不会把客户机搞死。还可以测试HTTPS类的网站请求…

【Python数据结构】——并查集的实现(查找、合并、集合、实例)

#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/7/30 23:12 # Author : linlianqin # Site : # File : 并查集专题&#xff08;合并、查找、集合&#xff09;.py # Software: PyCharm # description: 并查集其实就是多个数组&#xff0c;每一个数组都…

如何实现ABB机器人与老式焊机的连接控制

问题&#xff1a; 请教一个机器人与老式焊机如何连接&#xff0c;如何设置。 我现在是用SET指令设DO为1再外接继电器来控制焊机工作的&#xff0c;用RESET指令来使焊机停止工作的。现在可 以焊接&#xff0c;但是如果中间停止或机器人报错停止不动&#xff0c;焊机始终处于工作…

gitlab 杂记

GitLab 编译部署 1&#xff0c;请尽量不要在国内主机上部署&#xff0c;中途天朝很有可能导致gem执行出现问题&#xff0c;以下在AWS上部署&#xff1b; 2&#xff0c;系统中必须要有swap分区&#xff0c;不然会出现500错误&#xff1b; 系统版本&#xff1a;CentOS 6.x x86_6…

Hadoop分布式系统的安装部署

1、关于虚拟机的复制 新建一台虚拟机&#xff0c;系统为CentOS7&#xff0c;再克隆两台&#xff0c;组成一个三台机器的小集群。正常情况下一般需要五台机器&#xff08;一个Name节点&#xff0c;一个SecondName节点&#xff0c;三个Data节点。&#xff09; 此外&#xff0c;为…

Windows线程调度学习(一)

前言 Windows 线程调度器的实现分散在内核各处&#xff0c;并且与许多组件都有关联&#xff0c;很难进行系统地学习&#xff0c;所以我打算写几篇文章来记录下自己学习过程中的思考和分析&#xff0c;同时也方便日后查阅&#xff0c;此文可以看作是《Windows内核原理与实现》中…

机器人的有效负荷

问题&#xff1a; 假如我想在程序里做多几个有效载荷,但在手动操纵画面上只能加一个,其它要怎样用?给个实际例子给我啊. 回答&#xff1a; 在搬运中&#xff0c;确实是有载荷发生变化的情况&#xff0c;如两抓(A B)的夹具&#xff0c;有三种载荷情况&#xff0c;1、A抓有载荷…