数据结构--二叉树删除树节点

删除树节点需要考虑以下情况:

删除叶子节点

步骤

  • 找到要删除的节点targetNode
  • 找到targetNode的父结点parentNode(考虑父节点是否存在)
  • 确定targetNode是parentNode的左子树还是右子树
  • 根据前面的情况进行删除
  • 左子树:parentNode.left=null
  • 右子树:parentNode.right=null

删除非叶子节点

有两个节点

步骤

  • 找到要删除的节点targetNode
  • 找到targetNode的父结点parentNode(考虑父节点是否存在)
  • 去找targetNode的右子树的左子树中的最小值(或左子树右子树的最大值)
  • 将targetNode的值和最小值的值进行互换
  • 即将问题转化为--->删除叶子节点

只有一颗子树

步骤

  • 找到要删除的节点targetNode
  • 找到targetNode的父结点parentNode(考虑父节点是否存在)
  • 确定targetNode是parentNode的左子树还是右子树
  • 确定targetNode有的是左子树还是右子树
  • 情景1:是左子树,有左子树,将自己的左子树赋给父结点的左子树
  • 情景2:是左子树,有右子树,将右子树赋给父节点的左子树
  • 情景3:是右子树,有左子树,将自己的左子树赋给父结点的右子树
  • 情景4:是右子树,有右子树,将自己的右子树赋给父结点的右子树

有了上述概念后,就可以顺利的编写:

查询删除节点

java 复制代码
public TreeNode SearchNode(TreeNode node,int value){
        if(node==null){
            return null;
        }
        if(value==node.data){
            return node;
        }else if(value<node.data){
            if(node.left!=null){
                return SearchNode(node.left,value);
            }
        }else{
            if(node.right!=null){
                return SearchNode(node.right,value);
            }
        }
        return null;
    }

查询父结点

java 复制代码
public TreeNode SearchParent(TreeNode node,int value){
        if(node==null){
            return null;
        }
        if(node.left!=null&&node.left.data==value || node.right!=null&&node.right.data==value){
            return node;
        }else{
            if(node.left!=null&&value<node.data){
                return SearchParent(node.left,value);
            }else if(node.right!=null&&value>node.data){
                return SearchParent(node.right,value);
            }else{
                return null;
            }
        }
    }

找到最小节点

java 复制代码
public int delRightTreeMin(TreeNode node){
        TreeNode tempNode = node;
        while (tempNode.left !=null){
            tempNode = tempNode.left;
        }

        return tempNode.data; //最值进行返回
    }

删除

java 复制代码
//删除节点
    public void delete(TreeNode node,int value){
        if(node==null){
            return;
        }
        //单独的节点
        if(node.left==null&&node.right==null){
            node=null;
            return;
        }
        //首先查询要删除的节点
        TreeNode targetNode=SearchNode(node,value);
        if(targetNode==null){
            return;
        }
        TreeNode parentNode=SearchParent(node,value);
        if(targetNode.left==null&&targetNode.right==null){//叶子节点
            if(parentNode.left!=null&&parentNode.left.data==targetNode.data){
                parentNode.left=null;
            }else if(parentNode.right!=null&&parentNode.right.data==targetNode.data){
                parentNode.right=null;
            }
        }else if(targetNode.left!=null&&targetNode.right!=null){//双子树
            int minValue=delRightTreeMin(targetNode.right);
            delete(targetNode.right,minValue);//先删除叶子节点
            targetNode.data=minValue;//再覆盖原位置
        }else{//单子树
            if(targetNode.left!=null){//当前要删除的节点有左子树
                if(parentNode.left.data==targetNode.data){//删除的节点是父节点的左子树
                    parentNode.left=targetNode.left;
                }else{//删除的节点是父节点的右子树
                    parentNode.right=targetNode.left;
                }
            }else{//当前要删除的节点有右子树
                if(parentNode.left.data==targetNode.data){//删除的节点是父节点的左子树
                    parentNode.left=targetNode.right;
                }else{//删除的节点是父节点的右子树
                    parentNode.right=targetNode.right;
                }
            }
        }

    }
相关推荐
亮亮爱刷题9 天前
飞往大厂梦之算法提升-7
数据结构·算法·leetcode·动态规划
_周游9 天前
【数据结构】_二叉树OJ第二弹(返回数组的遍历专题)
数据结构·算法
双叶8369 天前
(C语言)Map数组的实现(数据结构)(链表)(指针)
c语言·数据结构·c++·算法·链表·哈希算法
zmuy9 天前
124. 二叉树中的最大路径和
数据结构·算法·leetcode
转码的小石9 天前
Java面试复习指南:并发编程、JVM、Spring框架、数据结构与算法、Java 8新特性
java·jvm·数据结构·spring·面试·并发编程·java 8
chao_7899 天前
滑动窗口题解——找到字符串中所有字母异位词【LeetCode】
数据结构·算法·leetcode
LZA1859 天前
数据结构day1
数据结构
稳兽龙9 天前
P3258 [JLOI2014] 松鼠的新家
数据结构·c++·算法·深度优先·lca
江边垂钓者9 天前
进程间通信、线程间通信
java·网络·数据结构
XiaoCCCcCCccCcccC9 天前
C语言数组介绍 -- 一维数组和二维数组的创建、初始化、下标、遍历、存储,C99 变长数组
c语言·数据结构·算法