对于二叉查找树的每个节点Node,它的左子树中所有的关键字都小于Node的关键字,而右子树中的所有关键字都大于Node的关键字。

二叉查找树的平均深度是O(log N)。

1.初始化

class BinarySearchTree(object):def __init__(self,key):self.key=keyself.left=Noneself.right=None

2.Find

    def find(self,x):if x==self.key:return selfelif x<self.key and self.left:return self.left.find(x)elif x>self.key and self.right:return self.right.find(x)else:return None

3.FindMin和FindMax

分别返回树中的最小元素与最大元素的位置。FindMin,从根开始并且只要有左儿子就向左进行查找,终止点是最小元素。FindMax则向右进行。

    def findMin(self):if self.left:return self.left.findMin()else:return selfdef findMax(self):tree=selfif tree:while tree.right:tree=tree.rightreturn tree

4.Insert

为了将x插入到树Tree中,先用find查找,如果找到x,则什么也不做。否则,将x插入到遍历路径的最后一点。

来自《Problem Solving with Algorithms and Data Structures》的图片:

    def insert(self,x):if x<self.key:if self.left:self.left.insert(x)else:tree=BinarySearchTree(x)self.left=treeelif x>self.key:if self.right:self.right.insert(x)else:tree=BinarySearchTree(x)self.right=tree

5.Delete

删除某节点有3种情况:

5.1 如果节点是一片树叶,那么可以立即被删除。

来自《Problem Solving with Algorithms and Data Structures》的图片:

5.2 如果节点只有一个儿子,则将此节点parent的指针指向此节点的儿子,然后删除。

来自《Problem Solving with Algorithms and Data Structures》的图片:

5.3 如果节点有两个儿子,则将其右子树的最小数据代替此节点的数据,并将其右子树的最小数据(不可能有左儿子,只有一个右儿子)删除。

来自《Problem Solving with Algorithms and Data Structures》的图片:

    def delete(self,x):if self.find(x):if x<self.key:self.left=self.left.delete(x)return selfelif x>self.key:self.right=self.right.delete(x)return selfelif self.left and self.right:key=self.right.findMin().keyself.key=keyself.right=self.right.delete(key)return selfelse:if self.left:return self.leftelse:return self.rightelse:return self

全部代码

class BinarySearchTree(object):def __init__(self,key):self.key=keyself.left=Noneself.right=Nonedef find(self,x):if x==self.key:return selfelif x<self.key and self.left:return self.left.find(x)elif x>self.key and self.right:return self.right.find(x)else:return None   def findMin(self):if self.left:return self.left.findMin()else:return selfdef findMax(self):tree=selfif tree:while tree.right:tree=tree.rightreturn treedef insert(self,x):if x<self.key:if self.left:self.left.insert(x)else:tree=BinarySearchTree(x)self.left=treeelif x>self.key:if self.right:self.right.insert(x)else:tree=BinarySearchTree(x)self.right=treedef delete(self,x):if self.find(x):if x<self.key:self.left=self.left.delete(x)return selfelif x>self.key:self.right=self.right.delete(x)return selfelif self.left and self.right:key=self.right.findMin().keyself.key=keyself.right=self.right.delete(key)return selfelse:if self.left:return self.leftelse:return self.rightelse:return self

上述写法的缺点是很难处理空树的情况。

另一种类似于链表的写法

class TreeNode(object):def __init__(self,key,left=None,right=None,parent=None):self.key=keyself.left=leftself.right=rightself.parent=parentdef hasLeftChild(self):return self.leftdef hasRightChild(self):return self.rightdef isLeftChild(self):return self.parent and self.parent.left==selfdef isRightChild(self):return self.parent and self.parent.right==self
class BSTree(object):def __init__(self):self.root=Noneself.size=0def length(self):return self.sizedef insert(self,x):node=TreeNode(x)if not self.root:self.root=nodeself.size+=1else:currentNode=self.rootwhile True:if x<currentNode.key:if currentNode.left:currentNode=currentNode.leftelse:currentNode.left=nodenode.parent=currentNodeself.size+=1breakelif x>currentNode.key:if currentNode.right:currentNode=currentNode.rightelse:currentNode.right=nodenode.parent=currentNodeself.size+=1breakelse:breakdef find(self,key):if self.root:res=self._find(key,self.root)if res:return reselse:return Noneelse:return Nonedef _find(self,key,node):if not node:return Noneelif node.key==key:return nodeelif key<node.key:return self._find(key,node.left)else:return self._find(key,node.right)def findMin(self):if self.root:current=self.rootwhile current.left:current=current.leftreturn currentelse:return Nonedef _findMin(self,node):if node:current=nodewhile current.left:current=current.leftreturn currentdef findMax(self):if self.root:current=self.rootwhile current.right:current=current.rightreturn currentelse:return Nonedef delete(self,key):if self.size>1:nodeToRemove=self.find(key)if nodeToRemove:self.remove(nodeToRemove)self.size-=1else:raise KeyError,'Error, key not in tree'elif self.size==1 and self.root.key==key:self.root=Noneself.size-=1else:raise KeyError('Error, key not in tree')def remove(self,node):if not node.left and not node.right:   #node为树叶if node==node.parent.left:node.parent.left=Noneelse:node.parent.right=Noneelif node.left and node.right:   #有两个儿子minNode=self._findMin(node.right)node.key=minNode.keyself.remove(minNode)else:    #有一个儿子if node.hasLeftChild():if node.isLeftChild():node.left.parent=node.parentnode.parent.left=node.leftelif node.isRightChild():node.left.parent=node.parentnode.parent.right=node.leftelse:    #node为根self.root=node.leftnode.left.parent=Nonenode.left=Noneelse:if node.isLeftChild():node.right.parent=node.parentnode.parent.left=node.rightelif node.isRightChild():node.right.parent=node.parentnode.parent.right=node.rightelse:   #node为根self.root=node.rightnode.right.parent=Nonenode.right=None

  

 

转载于:https://www.cnblogs.com/linxiyue/p/3624597.html

Python数据结构————二叉查找树的实现相关推荐

  1. python数据结构基础(单链表,多链表,二叉树)

    python数据结构基础(单链表,多链表,二叉树) 数据结构指数据对象中数据元素之间的关系 Python 给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做 ...

  2. python数据结构教程_GitHub - Frank-Jing/python_data_structures_and_algorithms: Python 中文数据结构和算法教程...

    Python 算法与数据结构视频教程 课程简介 数据结构和算法是每个程序员需要掌握的基础知识之一,也是面试中跨不过的槛.目前关于 Python 算法和数据结构的系统中文资料比较欠缺, 笔者尝试录制视频 ...

  3. python3 namedtuple_你不能低估的Python数据结构Namedtuple(二)

    上篇你不能低估的Python数据结构Namedtuple(一)讲了namedtuple的一些基本用法,本篇继续. namedtuples和数据类(Data Class)之间有什么区别? 功能 在Pyt ...

  4. python线性表和队列_[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列...

    python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构 ...

  5. python数据结构 树_python数据结构之二叉树的建立实例

    先建立二叉树节点,有一个data数据域,left,right 两个指针域 复制代码 代码如下: # -*- coding: utf - 8 - *- class TreeNode(object): d ...

  6. python数据结构包括什么_Python中的数据结构详解

    概述 在深入研究数据科学和模型构建之前,Python中的数据结构是一个需要学习的关键内容 了解Python提供的不同数据结构,包括列表.元组等 介绍 数据结构听起来是一个非常直截了当的话题,但许多数据 ...

  7. python数据结构树和二叉树,python数据结构树和二叉树简介

    一.树的定义 树形结构是一类重要的非线性结构.树形结构是结点之间有分支,并具有层次关系的结构.它非常类似于自然界中的树. 树的递归定义: 树(Tree)是n(n≥0)个结点的有限集T,T为空时称为空树 ...

  8. python数据结构推荐书-关于数据结构,有哪些不错的参考书推荐?

    学习编程,数据结构是你必须要掌握的基础知识,那么数据结构到底是什么呢? 其实数据结构就是用来描述计算机里存储数据的一种数学模型,因为计算机里要存储很多乱七八糟的数据,所以也需要不同的数据结构来描述. ...

  9. CodeSalt | Python数据结构的实现 — 链表

    Python数据结构实现-链表 1. 简单介绍 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Point ...

最新文章

  1. change python是什么意思_回溯是什么意思?
  2. Oracle Client安装
  3. iOS 即时聊天键盘处理
  4. mysql root密码重置
  5. javascript 运算优先级
  6. 程序员在囧途之我是一头牛
  7. [JavaWeb-Servlet]概述与快速入门
  8. SAP “麻辣三人行”小厨房|用黑科技“烹制”HR数字料理
  9. 华为P30/P30 Pro细节再曝光:3.5mm耳机插孔和红外遥控各占其一
  10. 异构GoldenGate 12c 单向复制配置
  11. wdatepicker不显示秒_「超逸酷玩」秒秒测智能健康日历如何正确使用电子墨水屏...
  12. 深入理解java虚拟机---JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)(十二)
  13. 柳传志:如何看人和用人
  14. oracle11 odac,oracle 11g odac 下载
  15. word大纲视图快速转成PPT
  16. Bootstrap4 图片形状——圆形实现
  17. zipentry java_java.util.zip 类 ZipEntry - Java 中文参考手册
  18. 链表-1(链表理论基础、移除链表元素、设计链表翻转链表)
  19. 统计项目代码行数 intelliJ idea statistic 插件
  20. 数据增强(扩充)适合初学者

热门文章

  1. 实现购物车的Session
  2. php中写alter,MySQL之alter语句用法总结
  3. python中怎样向字典中添加值_python的字典中,如何向指定路径添加值?
  4. STM8单片机ADC模拟看门狗功能实现
  5. Linux学习笔记---移植官方uboot步骤(二)
  6. STM32F103单片机输出相位可调PWM波
  7. 【Machine Learning 四】设置机器学习可用的Matlab编程分配环境
  8. 机器学习相关速查表Cheat Sheet
  9. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb8 in position 24: invalid start byte
  10. Java 命令行运行参数大全