二叉树添加删除节点Python
一棵二叉树,每一个节点都有左子树和右子树,二叉树的操作都可以递归的调用子树来完成。在C中有指针的概念,子树用指针实现,函数用指针作为参数。但是,Python采用对象引用,对空对象赋值,只在函数作用范围内有效,并不会生成一个新节点。如果是删除过程,那么仅传递的变量被指向空,也不会改变树的链式结构。
二叉树添加删除节点
- 问题说明,添加节点伪代码:
node = root insert(node) def insert(node): if node == None: node = Node(key,value) ## node赋值后不再代表父节点的子节点,而是指向一个新的对象 ## 插入失败 else: node = node.chlid insert(node)
- 问题说明,删除节点说明
node = root delete(node) def delete(node,key): if node.key == key: node == None ## node 指向None常量,而原节点不变 ## 删除失败 else: node = node.child delete(node)
用函数返回值,解决以上问题。注意以下递归调用的函数都return node
插入节点
def insert(self,key,value): self.root = self._insert(self.root,key,value) def _insert(self,node,key,value): if(node==None): self.count= self.count+1 node = Node(key,value) return node elif(node.key > key): node.lnode = self._insert(node.lnode,key,value) return node else: node.rnode = self._insert(node.rnode,key,value) return node
删除节点
def removekey(self,key): #self.root=self._removekey(self.root,key) self.root = self._remove(self.root,key) def _remove(self,node,key): if(node.key == key): if(node.rnode!= None): node.rnode,key,value = self.delmin(node.rnode) newnode = Node(key,value) newnode.rnode = node.rnode newnode.lnode = node.lnode return newnode elif(node.lnode!=None): node.lnode,key,value = self.delmax(node.lnode) newnode = Node(key,value) newnode.rnode = node.rnode newnode.lnode = node.rnode return newnode else: self.count = self.count -1 return None elif(node.key > key): node.lnode = self._remove(node.lnode,key) return node else: node.rnode = self._remove(node.rnode,key) return node
删除节点算法
- 如果左子树不为空,用左子树最大值替换该节点,并删除左子树中最大值节点。
- 如果右子树不为空,用右子树最小值替换该节点,并删除右子树中最小值节点。
- 如果左右子树都为空,直接删除该节点。
此算法默认优先删除左子树,会造成二叉树不平衡
def delmin(self,node): if(node.lnode == None): self.count = self.count-1 return node.rnode,node.key,node.value else: node.lnode,key,value = self.delmin(node.lnode) return node,key,value def delmax(self,node): if(node.rnode == None): self.count = self.count-1 return node.lnode,node.key,node.value else: node.rnode,key,value= self.delmax(node.rnode) return node,key,value
总结:
采用递归调用实现二叉树添加、删除节点。文章采用Python对象引用方式实现指针结构的创建。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java 面向对象 之 enum 枚举类型
http://www.verejava.com/?id=17159522877829 /** * * 1. 常量 : 用final 修饰的变量 * 注意: 常量 遵循标识符命名规则, 一般大写 * * 2. enum 枚举类型 : 遵循标识符命名规则, 首字母大写 * 枚举类型: 是一种特殊的限定的常量类型 * 优点 : 限定值 * */ public class Test1 { public static void main(String[] args) { // 实例化 r=5 红色的圆 Circle red = new Circle(5, Color.RED); //red.PI=1000; red.draw(); // 实例化 r=10 绿色的圆 Circle green = new Circle(10, Color.GREEN); green.draw(); // 实例化 r=20 蓝色的圆 Circle blue = new Circle(20, Color.BLUE); blue.draw(); } } //定义枚举类型 enum Color { RED, GREEN, ...
- 下一篇
JDK源码精读-汇总帖
前言 大家可能都会阅读JDK源码,目前很多大神也分享了相应的博客,让后来者可谓是站在巨人的肩膀上。 有一点点问题,绝大多数的分享都是比较粗略的,其中很多复杂的方法没有记录设计思路,处理步骤等等。决定有时间的时候认真读一读,希望能多了解一下JDK的源码,达到精度的水平。 导航 java.lang.Integer源码精读(一) 转载请注明出处 JDK源码精读-汇总帖 地址:https://www.jianshu.com/p/14092cfab6d9
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果