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

来源:互联网 发布:系统的分析优化ppt 编辑:程序博客网 时间:2024/06/13 08:35

  本文的代码来自于《数据结构与算法(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();}
0 0
原创粉丝点击