您的位置:首页 > 编程语言 > Java开发

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

2017-05-08 00:00 267 查看
  本文的代码来自于《数据结构与算法(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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐