数据算法之二叉树删除(BinaryTreeL Remove)的Java实现

  本文的代码来自于《数据结构与算法(JAVA语言版)》,是笔者在网上找到的资料,非正式出刊版物。笔者对代码一些比较难以理解的部分添加了注释和图解,欢迎大家来讨论。
  二叉树删除要分为三种情况。
  第一种:如果为叶子结点,则可以直接删除,如图一。


二叉树删除


  第二种:如果只有左子树或者只有右子树的时候,只要令其左子树或右子树为其父节点的左子树或右子树即可,如图二。


  二叉树删除


  第三种:如果节点既有左节点,又有右节点,则我们需要先用中序序列中节点的前驱或后序替换该节点,然后删除其前驱或后序节点。此时该节点的前驱或后序节点必然是没有右孩子或者左孩子的节点,删除方法可以参照第二种,如图三。


  二叉树删除


输入:待删除元素ele
输出:在二叉查找树中删除ele
代码:

public Object remove(Object ele){
    BinTreeNode v = (BinTreeNode)binTSearch(root,ele);
    if (v==null) return null; //查找失败
    BinTreeNode del = null; //待删结点
    BinTreeNode subT = null; //待删结点的子树
    if (!v.hasLChild()||!v.hasRChild()) //确定待删结点
        del = v;
    else{
        del = getPredecessor(v);
        Object old = v.getData();
        v.setData(del.getData());
        del.setData(old);
    }
    startBN = del.getParent(); //待平衡出发点 *
    //此时待删结点只有左子树或右子树
    if (del.hasLChild())
        subT = del.getLChild();
    else
        subT = del.getRChild();
    if (del==root) { //若待删结点为根
        if (subT!=null) subT.sever();
        root = subT;
    } else
    if (subT!=null){
        //del为非叶子结点
        if (del.isLChild()) del.getParent().setLChild(subT);
        else del.getParent().setRChild(subT);
    }
    else//del为叶子结点
        del.sever();
    return del.getData();
}
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值