二叉排序树的删除节点

步骤:首先,我们先从根节点开始查找到要删除的这个节点,然后删除该节点,然后再妥善安置该该节点的子树或子节点。

要删除的节点分为三种情况:1,当要删除的节点的是叶子结点的时候;2,当要删除的节点只有一个子节点或子树的时候;3,当要删除的节点同时有左右两棵子树的时候。

对于第一种情况,要删除的节点是叶子结点的时候,删除的办法是直接删除掉该节点即可;

对于第二种情况,要删除的节点有一个子节点或子树的时候,删除的办法是先将该节点删除,然后将它的子节点或子树直接挪到该节点的位置即可。

对于第三种情况,要删除的节点同时有左右两颗子树的时候,删除的办法是分为两种情况:

1,先找到右子树中最小的那个节点、或者左子树中最大的那个节点,然后删除该删除的节点,然后将右子树中最小的那个节点或者左子树中最大的那个节点,挪到删除的位置即可。

2,如果右子树中最小的那个节点有一个右子节点,或者左子树中最大的那个节点有一个左子结点,此时删除的办法是:先删除该删除的节点,然后将右子树中最小的那个节点或者左子树中最大的那个节点,挪到删除的位置,然后将右子树中最小的那个节点的右子节点,或者左子树中最大的那个节点的左子结点,挪到右子树中最小的那个节点、或者左子树中最大的那个节点的位置即可。

3,如果右子树中最小的那个节点有左右两个节点,或者左子树中最大的那个节点有左右两个结点,这种情况是不可能的,因为此时右子树中最小的那个节点肯定就是该节点的左子结点了,左子树中最大的那个节点肯定就是该节点的右子节点了。

写不下去、烂尾的代码...

 /**
       * 删除节点:
       * @param rootNode:根节点,用来找到指定的要删除的节点
       * @param value:要删除的节点的值
       */
      public void deleteLeafNode(BinaryTreeNode rootNode, int value) {
            //1,寻找该节点:
            if (null == rootNode) {
                  return;
            } else {
                  BinaryTreeNode leftNode = rootNode.getLeftNode();
                  BinaryTreeNode rightNode = rootNode.getRightNode();
                  if (leftNode != null) {
                        if (leftNode.getNodeValue() == value) {
                              //1,如果该节点是叶子结点:—— 则直接删除该节点
                              if (null == leftNode.getLeftNode() && null == leftNode.getRightNode()) {
                                    rootNode.setLeftNode(null);
                              }
                              //2,如果该节点有一个子节点/子树:——先删除该节点,然后将其子节点上位挪到该节点的位置;
                              if (null == leftNode.getLeftNode() && null != leftNode.getRightNode()) {
                                    rootNode.setLeftNode(leftNode.getRightNode());
                              } else if (null != leftNode.getLeftNode() && null == leftNode.getRightNode()) {
                                    rootNode.setLeftNode(leftNode.getLeftNode());
                              }
                              //3,如果该节点有两个子节点/子树:——先删除该节点,然后将其该节点的左子树的最大节点或者右子树的最小节点上位挪到该节点的位置;
                              if (null != leftNode.getLeftNode() && null != leftNode.getRightNode()) {
                                    //以将该节点的右子树的最小节点上位为例:
                                    BinaryTreeNode leftNodeRightNode = leftNode.getRightNode();
                                    BinaryTreeNode minNode = qryRightChildMinNode(leftNodeRightNode);
                                    //3.1,如果该节点的右子树的最小节点为叶子结点,则直接上位挪到该节点的位置即可;

                                    //3.2,如果该节点的右子树的最小节点有一个右子节点,
                                    //          则先将这个右子树的最小节点上位到该节点的位置,
                                    //          然后将这个右子树的最小节点的右子节点上位到这个右子树的最小节点的位置;
                                    //写不下去了,就这吧...


                              }


                        }
                  }
                  if (rightNode != null) {

                  }

            }
      }


      /**
       * 查找该节点的右子树中的最小节点:
       * @param node 该节点的右子节点
       */
      BinaryTreeNode minBinaryTreeNode = null;

      public BinaryTreeNode qryRightChildMinNode(BinaryTreeNode node) {
            if (null == node) {
                  return minBinaryTreeNode;
            } else {
                  minBinaryTreeNode = node;
                  BinaryTreeNode leftNode = node.getLeftNode();
                  BinaryTreeNode rightNode = node.getRightNode();
                  minBinaryTreeNode = leftNode.getNodeValue() < minBinaryTreeNode.getNodeValue() ? leftNode : minBinaryTreeNode;
                  minBinaryTreeNode = rightNode.getNodeValue() < minBinaryTreeNode.getNodeValue() ? rightNode : minBinaryTreeNode;
                  qryRightChildMinNode(leftNode);
                  qryRightChildMinNode(leftNode);
            }
            return minBinaryTreeNode;
      }

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值