【数据结构】二叉搜索树的python实现

二叉搜索树是以二叉树来组织的,对于一个二叉搜索树的节点,其左子树节点的元素值都不大于该节点元素值,其右子树节点的元素值都不小于该节点的元素值。
首先定义一个初始化二叉搜索树节点的类TNode,每一个节点包括节点元素值val,指向父节点的地址par,指向左子树的地址left,指向右子树的地址right。

class TNode(object):'''初始化树节点'''def __init__(self,val):self.val = valself.par = Noneself.left = Noneself.right = None

然后定义二叉搜索树的类BST,包括初始化根节点的函数__init__。

class BST(object):#1.初始化根节点def __init__(self):self.root = None

判断二叉搜索树是否为空的函数isEmpty。

    #2.判断二叉树是否为空    def isEmpty(self):if self.root == None:return Trueelse:return False

向二叉搜索树种插入新节点的函数add。采用递归方法,如果新节点的元素值小于当前节点的元素值,判断当前节点是否有左子树?如果没有,新的节点作为当前节点的左子树节点;如果有,继续与当前节点的左子树根节点比较。如果新节点元素大于当前节点的元素值,判断当前节点是否有右子树?如果没有,新节点作为当前节点的右子树节点;如果有,继续与当前节点的右子树根节点比较。

    #3.插入节点def add(self,data):'''input:data:待插入的节点数据'''#首先判断二叉树是否为空,如果为空,节点作为根节点if self.isEmpty():node = TNode(data)self.root = nodeelse:#递归函数,如果节点小于父节点,且父节点没有左子节点,则作为父节点的左子节点;如果父节点有左子节点,将节点插入到左子树中。def insert(cur_node,data):if data <= cur_node.val:if cur_node.left:insert(cur_node.left,data)else:node = TNode(data)cur_node.left = nodenode.par = cur_nodeelif data >= cur_node.val:if cur_node.right:insert(cur_node.right,data)else:node = TNode(data)cur_node.right = nodenode.par = cur_nodeinsert(self.root,data)

搜索二叉搜索树中是否有某个数值的节点的函数search,并返回第一个节点;

    #4.寻找二叉搜索树中是否有某个节点def search(self,cur_node,data):'''input:cur_node:需要查找最小节点子树的根节点'''#判断二叉搜索树是否为空if self.isEmpty():print('二叉搜索树为空,无法进行搜索操作!')return Falseelse:def find(node,data):if node == None:print('二叉搜索树中没有节点的值为:',data)return Falseif node.val == data:return nodeif data < node.val:return find(node.left,data)if data > node.val:return find(node.right,data)result = find(cur_node,data)return result

从子树中查找最小节点的函数findmin,从子树中查找最大节点的函数findmax。查找最小节点在左子树中递归,查找最大节点在右子树中递归。

    #5.查找最小节点和最大节点def findmin(self,cur_node):'''input:cur_node:需要查找最小节点子树的根节点'''#判断二叉搜索树是否为空if self.isEmpty():print('二叉搜索树为空,无法进行搜索操作!')return Falseelse:def fm(node):if node.left:return fm(node.left)else:return nodereturn fm(cur_node)def findmax(self,cur_node):#判断二叉搜索树是否为空if self.isEmpty():print('二叉搜索树为空,无法进行搜索操作!')return Falseelse:def fm(node):if node.right:return fm(node.right)else:return nodereturn fm(cur_node)

从某个子树中删除某个数值的节点的函数delete。分为三种情况:
(1)如果该节点是叶节点,直接删除。
(2)如果该节点只有一个子节点,该节点的父节点直接与其子节点连接
(3)如果该节点有两个子节点,将其右子树的最小数据替代此节点的数据,并删除有右子树的最小数据

    #6.删除某节点def delete(self,cur_node,data):'''input:cur_node:需要删除节点的树的根节点data:需要删除节点的元素值三种情况(1)如果该节点是叶节点,直接删除(2)如果该节点只有一个子节点,该节点的父节点直接与其子节点连接(3)如果该节点有两个子节点,将其右子树的最小数据替代此节点的数据,并删除有右子树的最小数据'''node = self.search(cur_node,data)if not node:print('删除操作:二叉搜索树没有节点的值为:',data,'无法执行删除操作')return False       else:# 如果该节点是叶节点if node.left == None and node.right == None:if node == self.root:self.root = Noneprint('二叉搜索树为空!')elif node.par.left == node:node.par.left = Noneelif node.par.right == node:node.par.right = None# 如果该节点只有一个子节点,其父节点直接指向其子节点if node.left and node.right == None:if node == self.root:self.root.val = node.left.valself.root.left = node.left.leftelse:node.par.left = node.leftnode.left.par = node.parif node.right and node.left == None:if node == self.root:self.root.val = node.right.valself.root.right = node.right.rightelse:node.par.right = node.rightnode.right.par = node.par# 如果该节点有两个子节点,将其右子树的最小数据替代此节点的数据,并删除有右子树的最小数据if node.right and node.left:min_right = self.findmin(node.right)node.val = min_right.valself.delete(node.right,min_right.val)

采用递归方法先序遍历二叉搜索树的函数front_travel;采用递归方法中序遍历二叉搜索树的函数middle_travel和采用递归方法后序遍历二叉搜索树的函数back_travel。

    #7.递归先序遍历def front_travel(self):#如果二叉树为空,返回空列表if self.isEmpty():return []else:def loop(cur_node):tmp = []if cur_node:tmp.append(cur_node.val)tmp += loop(cur_node.left)tmp += loop(cur_node.right)return tmpvalue_list = loop(self.root)return value_list#8.递归中序遍历def middle_travel(self):#如果二叉树为空,返回空列表if self.isEmpty():return []else:def loop(cur_node):tmp = []if cur_node:tmp += loop(cur_node.left)tmp.append(cur_node.val)tmp += loop(cur_node.right)return tmpvalue_list = loop(self.root)return value_list#9.递归后序遍历def back_travel(self):#如果二叉树为空,返回空列表if self.isEmpty():return []else:def loop(cur_node):tmp = []if cur_node:tmp += loop(cur_node.left)tmp += loop(cur_node.right)tmp.append(cur_node.val)return tmpvalue_list = loop(self.root)return value_list

【数据结构】二叉搜索树的python实现相关推荐

  1. 数据结构---二叉搜索树

    数据结构-二叉搜索树 原理:参考趣学数据结构 代码: 队列代码: #pragma once #define N 100 #define elemType bstTree* #include<st ...

  2. 二叉树查找python_二叉搜索树的python实现

    介绍 二叉查找树(Binary Search Tree),也称为二叉搜索树.有序二叉树或排序二叉树,是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节 ...

  3. 二叉搜索树的删除操作可以交换吗_JavaScript数据结构 — 二叉搜索树(BST)ES6实现...

    1. 概述 最基本的数据结构是向量和链表,为了将二者的优势结合起来,我们引入了二叉树,可以认为二叉树是列表在维度上的拓展.而今天要介绍的二叉搜索树(BST)则是在形式上借鉴了二叉树,同时也巧妙借鉴了有 ...

  4. 数据结构 二叉搜索树BST的实现与应用

    概念 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 1.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 ...

  5. [学习][数据结构]二叉搜索树

    定义 一棵二叉搜索树是以一棵二叉树来组织的,如下图.这样一棵树可以使用一个链表数据结构来表示,其中每个节点就是一个对象.除了key和卫星数据之外,每个节点还包含属性left.right和p,他们分别指 ...

  6. 数据结构——二叉搜索树

    一.定义 二叉搜索树(binary search tree),又叫二叉查找树.二叉排序树.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于 ...

  7. 数据结构——二叉搜索树的C语言实现

    1.什么是二叉搜索树? 2.二叉搜索树的操作 3.二叉搜索树的C语言实现 #include<stdio.h> #include<stdlib.h>#define Element ...

  8. 算法设计与分析--最优二叉搜索树(Python)

    最优二叉搜索树: 给定一个n个不同关键字的已排序的序列K=<k1,k2,-,kn>(因此k1<k2<-<kn)我们希望用这些关键字构造一棵二叉树.对每个关键字ki,都有一 ...

  9. 数据结构 二叉搜索树的删除

    文章目录 概述 待删除的结点没有子树 待删除的结点仅有一颗子树 待删除的结点有两颗子树 C代码实现 概述 这是一篇短文,专门考究一下二叉搜索树的删除. 二叉搜索树的建立非常简单,如果不熟悉的见此文 树 ...

最新文章

  1. Go 学习笔记(19)— 函数(05)[如何触发 panic、触发 panic 延迟执行、panic 和 recover 的关系]
  2. CentOS 7安装使用Github
  3. 虚拟机(VMware Workstation)中,把连接网络的模式由“NAT模式”,改成“自动桥接模式”,网速大大的提升...
  4. apk去除签名验证工具安卓版_App 签名过期或泄露怎么办?别担心,Google 已经给出解决方案!...
  5. java调用浏览器组件来_Java 网页浏览器组件介绍
  6. 多线程编程-条件变量
  7. android 创建文件夹_Android 动画小记
  8. dos 改某个目录下所有文件的时间_go语言入门学习笔记(2)-DOS操作及go语言变量学习...
  9. Qt工作笔记-把QTableWidget数据存为XML,启动时加载XML
  10. python语法学习—打印九九乘法表
  11. Squeeze-and-Excitation Networks(SENet )
  12. 【转载】SpringMVC访问静态资源
  13. centos 最小化安装 补充命令_CentOS7安装后没网络的解决方法
  14. 基于SSM的社区宠物信息管理系统
  15. Java分布式架构:应用+特点+架构模式
  16. 【浅谈】日文的文本等出现乱码的情况以及解决办法
  17. 小米笔记本 镜像_小米笔记本Air 13.3 指纹版安装黑苹果 macOS High Sierra 10.13 教程...
  18. 4.shell脚本中的变量
  19. 关于ArcMap中道路、河道中心线提取过程
  20. vue打包后在ie浏览器下访问报语法错误

热门文章

  1. struts2.0.14 web.xml,struts.xml配置
  2. 日本新年传统习俗介绍(一)
  3. 蓝筹股、红筹股的含义
  4. Q120:PBRT-V3,“直接光照”积分器(14.3章节)(翻译不下去了)
  5. 图像处理实战-Python编程进阶
  6. 常用机器学习算法汇总
  7. Hive电商数仓实战
  8. 如何搭建企业数据平台
  9. Linux添加1G虚拟内存,Linux下怎样增加虚拟内存
  10. 怎么遍历list集合赋值_Java 集合入门知识