二叉树算法删除代码实现

此代码仅供参考,如有疑问欢迎评论:


二叉树的删除操作比较复杂,主要分三种情况:1、删除没有子节点的节点,2、删除只有一个节点的节点(其中有分为两种情况),3、删除有两个节点的节点。

在讲解之前我先把查找的代码附上,以为删除过程需要用到这段儿查找的代码:
      public  TreeNode search(  int  key) {
          TreeNode pNode =  root ;
            while  (pNode !=  null ) {
                if  (key == pNode.  key ) {
                     return  pNode;
              }  else  if  (key > pNode.  key ) {
                   pNode = pNode.  rchild ;
              }  else  if  (key < pNode.  key ) {
                   pNode = pNode.  lchild ;
              }
          }
            return  null ;  // 如果没有搜索到结果那么就只能返回空值了
     }

首先看第一种情况:(删除没有子节点的节点)
      删除没有子节点的节点只需要将被删除节点的父节点指向空即可
            if (pNode.  lchild  ==  null  && pNode.  rchild  ==  null ) {
                if (pNode ==  root ) {   //如果是根节点,那么就删除整棵树
                     root  =  null ;
              }  else  if (pNode == pNode.  parent .  lchild ){
                     //如果这个节点是父节点的左节点,则将父节点的左节点设为空
                   pNode.  parent .  lchild  =  null ;
              }  else  if (pNode == pNode.  parent .  rchild ) {
                     //如果这个节点是父节点的右节点,则将父节点的右节点设为空
                   pNode.  parent .  rchild  =  null ;
              }
          }

第二种情况:(删除只有一个子节点的节点)
      删除有一个子节点的节点,只需要将被删除节点的父节点指向删除节点的子节点即可
           //第二种情况: (删除有一个子节点的节点)
            //如果要删除的节点只有右节点
            if (pNode.  lchild  ==  null 
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,F# 是一种函数式编程语言,可以在 .NET 平台上运行。如果你想在 F# 实现平衡二叉树算法,你需要了解这种数据结构的基本知识,然后使用递归和模式匹配来实现它。 下面是一个 F# 的平衡二叉树示例代码,它实现了插入、查找、删除和遍历操作: ``` type BinaryTree<'T> = | Leaf | Node of BinaryTree<'T> * 'T * BinaryTree<'T> * int type BinarySearchTree<'T when 'T : comparison> = | Leaf | Node of BinarySearchTree<'T> * 'T * BinarySearchTree<'T> * int let rec insert value tree = match tree with | Leaf -> Node(Leaf, value, Leaf, 1) | Node(left, nodeValue, right, _) -> if value < nodeValue then let newLeft = insert value left Node(newLeft, nodeValue, right, newLeft.Height + 1) else let newRight = insert value right Node(left, nodeValue, newRight, newRight.Height + 1) let rec find value tree = match tree with | Leaf -> false | Node(left, nodeValue, right, _) -> if value = nodeValue then true elif value < nodeValue then find value left else find value right let rec deleteMin tree = match tree with | Leaf -> Leaf | Node(Leaf, value, right, _) -> right | Node(left, value, right, _) -> let newLeft = deleteMin left Node(newLeft, value, right, newLeft.Height + 1) let rec deleteMax tree = match tree with | Leaf -> Leaf | Node(left, value, Leaf, _) -> left | Node(left, value, right, _) -> let newRight = deleteMax right Node(left, value, newRight, newRight.Height + 1) let rec delete value tree = match tree with | Leaf -> Leaf | Node(left, nodeValue, right, _) -> if value = nodeValue then match left, right with | Leaf, Leaf -> Leaf | Leaf, _ -> right | _, Leaf -> left | _, _ -> let minValue = minValue right let newRight = deleteMin right Node(left, minValue, newRight,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值