二叉树删除节点

二叉树删除节点比较麻烦,一般可能会设置一个isdeleted标记删除的节点而不真的删除节点,删除情况有以下几种:

1,删除的节点是根节点

2,删除的节点无子节点

3,删除的节点只有一个子节点

4,删除的节点有2个子节点。这里面又要判断删除的节点的右子节点有无左子节点,如无,将右子节点替换删除的节点即可;如有,找到最左子节点,去替换要删除的节点,还要注意最左子节点可能也有右子节点,这个节点也要接到最左子节点的父节点上去

以下是代码:

//删除根节点代码有误,在其他判断里加上一个判断是否是根的条件即可

boolean delete(int key){
      if(!isEmpty()){
          Node current=root;
          Node temp=root;
              while(current.data!=key){
                   temp=current;//保存要删除节点的父节点
                  if(key<current.data)
                      current=current.left;
                  else current=current.right;
                  if(current==null)
                      return false;
                  
                  }
              if(current==root)//根节点,有误,在其他处判断
                  root=null;
              else if(current.left==null&&current.right==null){//无子节点
                  if(current.data<temp.data)
                      temp.left=null;
                  else temp.right=null;
              }
              else if(current.left==null&&current.right!=null){//右子节点
                  if(current.data<temp.data)
                      temp.left=current.right;
                  else temp.right=current.right;
              }
              else if(current.left!=null&&current.right==null){//左子节点
                  if(current.data<temp.data)
                      temp.left=current.left;
                  else temp.right=current.left;
              }
              else{//有2个子节点
                  if(current.right.left==null){//要删除的节点的右子节点没有左子节点
                      current.right.left=current.left;
                      if(current.data<temp.data){
                          temp.left=current.right;
                      }
                      else{
                          temp.right=current.right;
                      }
                      
                  }
                  else{
                      Node t=current.right.left;
                      Node temp1=current.right;
                     while(t.left!=null){
                         t=t.left;
                         temp1=temp1.left;//保留要删除节点的右子节点的最左子节点的父节点
                     }
                     if(t.right==null){//此时t肯定无左子节点
                         t.left=current.left;
                         t.right=current.right;
                         if(current.data<temp.data){
                             temp.left=t;
                         }
                         else{
                             temp.right=t;
                         }
                        
                        temp1.left=null;
                        
                     }
                     else{
                         Node temp2=t.right;
                         t.left=current.left;
                         t.right=current.right;
                         if(current.data<temp.data)
                             temp.left=t;
                         else temp.right=t;
                         temp1.left=temp2;
                     }
                  }
                      
              }
              return true;
              }
      else return false;
          }  
这里面(可能会)存在一个问题,是一个顺序问题,比如你如果先把最左子节点接到要删除的节点的父节点上去,然后再把要删除节点的左子节点接到替换后的最左子节点上去,以及之后的一些接上节点操作,要删除节点的父节点一旦不再指向它,那么它的和它的子节点可能当垃圾回收掉,虽然引用不指向它只有片刻时间,我也不知道是不是存在被回收的可能性,但是最好顺序要做好。代码中顺序应该是没有逻辑问题的。

二叉树删除节点有以下几种情况: 1. 被删除节点是叶子节点,直接删除即可。 2. 被删除节点只有一个子节点,将该子节点替换被删除节点即可。 3. 被删除节点有两个子节点,需要找到被删除节点的中序遍历的后继节点(即比被删除节点大的最小节点),将后继节点的值复制到被删除节点中,然后将后继节点删除。 下面是一个示例代码,实现了二叉树删除节点的功能: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def deleteNode(root: TreeNode, key: int) -> TreeNode: if not root: return None if root.val == key: # 被删除节点是叶子节点或只有一个子节点 if not root.left: return root.right if not root.right: return root.left # 被删除节点有两个子节点,找到后继节点 successor = root.right while successor.left: successor = successor.left root.val = successor.val # 删除后继节点 root.right = deleteNode(root.right, successor.val) elif root.val > key: root.left = deleteNode(root.left, key) else: root.right = deleteNode(root.right, key) return root ``` 该代码中,函数 `deleteNode` 接受一个二叉树节点和一个需要被删除的值,返回删除节点后的二叉树节点。如果节点为空,直接返回 `None`。如果节点的值等于删除值,据情况进行删除操作。如果节点的值大于删除值,递归处理左子树;否则递归处理右子树。最后返回删除节点后的节点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值