二叉树添加删除节点Python

简介: 一棵二叉树,每一个节点都有左子树和右子树,二叉树的操作都可以递归的调用子树来完成。在C中有指针的概念,子树用指针实现,函数用指针作为参数。但是,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

删除节点算法

  1. 如果左子树不为空,用左子树最大值替换该节点,并删除左子树中最大值节点。
  2. 如果右子树不为空,用右子树最小值替换该节点,并删除右子树中最小值节点。
  3. 如果左右子树都为空,直接删除该节点。

此算法默认优先删除左子树,会造成二叉树不平衡

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对象引用方式实现指针结构的创建。

目录
相关文章
|
27天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
50 5
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
68 6
|
5月前
|
Python
【Leetcode刷题Python】450. 删除二叉搜索树中的节点
LeetCode上538号问题"把二叉搜索树转换为累加树"的Python实现,使用反向中序遍历并记录节点值之和来更新每个节点的新值。
52 4
【Leetcode刷题Python】450. 删除二叉搜索树中的节点
|
5月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
83 7
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
62 5
|
5月前
|
Python
【Leetcode刷题Python】222. 完全二叉树的节点个数
LeetCode第222题"完全二叉树的节点个数"的Python代码实现,通过递归和深度优先遍历的方法来计算给定完全二叉树的节点总数。
60 5
|
5月前
|
存储 算法 Python
【Leetcode刷题Python】297. 二叉树的序列化与反序列化
LeetCode第297题"二叉树的序列化与反序列化"的Python语言解决方案,包括序列化二叉树为字符串和反序列化字符串为二叉树的算法实现。
30 5
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
50 4
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
44 3
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - I. 从上到下打印二叉树
本文介绍了使用Python实现从上到下打印二叉树的解决方案,采用层次遍历的方法,利用队列进行节点的访问。
40 2