#!/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

胡凡——算法笔记

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

  1. 数据结构——二叉查找树(BST)的删除

    数据结构--二叉树(BST)的删除 文章目录 数据结构--二叉树(BST)的删除 前言 一.BST删除的几种情况 二.节点删除方法 1.一般方法 2.对1方法的优化 3.懒汉删除(前继和后继) 前言 ...

  2. Python数据结构————二叉查找树的实现

    对于二叉查找树的每个节点Node,它的左子树中所有的关键字都小于Node的关键字,而右子树中的所有关键字都大于Node的关键字. 二叉查找树的平均深度是O(log N). 1.初始化 class Bi ...

  3. python数据结构剑指offer-从尾到头打印链表

    例题 描述 输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回). 如输入{1,2,3}的链表如下图: 返回一个数组为[3,2,1] 0 <= 链表长度 <= 1000 ...

  4. python链接数据库并创建/删除/插入多个数据库/表/表数据

    import pymysql l链接数据库并执行sql语句 conn = pymysql.connect(host='10.245.251.61',user='stashlog',password=' ...

  5. python 实现本地查找文件,并打印(os for os.open chdir)

    #coding:UTF-8 import os b=str(raw_input('请输入要查找的文件:')) a=str(raw_input('请输入要查找的目录:')) y=1 i=[y for y ...

  6. 二叉查找树--插入、查找、遍历、打印、删除(重点)

    查找二叉树: 一.定义 维基百科: https://zh.wikipedia.org/wiki/%E4%BA%8C%E5%85%83%E6%90%9C%E5%B0%8B%E6%A8%B9 二.代码: ...

  7. Python数据结构04-冒泡、选择、插入、归并、希尔、快速排序、二分查找

    Python数据结构 各种排序实现 常见排序算法效率比较 搜索 二分法查找 各种排序实现 排序思想不做描述. #冒泡 def bubble_sort(alist):for x in range(0,l ...

  8. C++ 单向链表 —— 初始化、插入、返回第一个节点、删除、查找、长度、打印、反转(逆序)

    单向链表的概念: 如果"一个节点"将指向"另一个节点的指针"作为数据成员,那么多个这样的节点可以连起来,只用一个变量就能够访问整个节点序列,我们称之为链表.如果 ...

  9. 用c语言实现单链表的初始化,建表,查找,求长度,插入,删除等操作,【YTU+2430+C语言习题+链表建立+插入+删除+输(5)...

    的打印.判断链表是否为空.计算链表长度.插入节点.删除节点.删除整个链表.(2) 线性表adt顺序存储实现中的创建.查找.插入和删除等基本操作及相关算法,线性表adt链式存储实现中单链表.循环链表和双 ...

  10. python链表删除尾部节点_python单链表中如何查找和删除节点?

    在之前的文章[python单链表中如何插入和输出节点?]中给大家介绍了单链表是什么,以及如何进行添加节点.输出所以节点.下面本篇文章给大家介绍如何查找和删除节点,希望对大家有所帮助. 如何从单链表中查 ...

最新文章

  1. 英特尔紧急召回SB主板,Intel 6系列芯片组设计缺陷
  2. Python学习笔记:电子邮件,POP3收取邮件
  3. Android 内存详细分析
  4. 利用Python进行简单的图像识别(验证码)
  5. 【英语学习】【Level 08】U02 Movie Time L3 Now showing
  6. 节点部署_Pod在多可用区worker节点上的高可用部署
  7. 【IDEA】IDEA 设置 字体 可以滚轮 改变大小
  8. mac下java环境变量配置
  9. VS2008中VC 项目 文件目录的管理 (最终无错误版)
  10. 响应式微服务 in java 译 十二 service discovery
  11. STL总结笔记(实用 / 比赛)
  12. eclipse的java插件,25个最好的免费Eclipse插件
  13. 台式计算机拆机步骤ppt,三相异步电动机拆装的方法和步骤.PPT
  14. PDF--变清晰方法
  15. win10开启快速启动,关机时电源键一直亮着无法正常关机。。。
  16. 《面向对象分析与设计》一3.7 例题
  17. 苹果设备的微信数据收集
  18. 计算机网路之面试常考
  19. uni-app - Refused to display ‘xxx‘ in a frame because an ancestor violates the following Content Sec
  20. VB全局HOOK写游戏盗号木马

热门文章

  1. jqueryui的Tooltip使用方法
  2. aix6.1 nfs
  3. 部分不能激活Win 7 的问题分析和解决方案
  4. OC-@dynamic 关键字
  5. datagrid 的标题的内容不对应整齐
  6. bzoj4245: [ONTAK2015]OR-XOR
  7. try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后?...
  8. Spring AOP 实战运用
  9. 系统带你学习 WebAPIs —— 动画篇(第六讲)
  10. 利用VOIP电话通信服务,他骗得18亿美元