数据算法之二叉树删除(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
- 数据算法之二叉树删除(BinaryTreeL Remove)的Java实现
- 数据算法之二叉树查找(BinaryTreeL Search)的Java实现
- 数据算法之二叉树插入(BinaryTreeL Insert)的Java实现
- 数据算法之二叉树平衡(BinTreeNode Rotate)的Java实现
- 【数据结构和算法】之二叉树的java实现
- 【LeetCode-面试算法经典-Java实现】【027-Remove Element(删除数组中指定的元素)】
- Java实现的二叉树算法
- 二叉树的遍历算法Java实现
- 二叉树算法删除代码实现
- Java实现二叉搜索树节点的删除
- Java实现二叉树的创建、删除、遍历
- java 二叉树实现算法
- 【数据结构】之二叉树的java实现
- 【数据结构】之二叉树的java实现
- 数据结构之二叉树的Java实现
- 【数据结构】之二叉树的java实现
- 【数据结构】之二叉树的java实现
- 【数据结构】之二叉树的java实现
- Android之旅第一站——初识安卓…
- foreach属性-动态-mybatis中使用map类型参数,其中key为列名,value为列值
- wdcp两种安装方式
- QWaitCondition 的正确使用方法
- Android OTA升级包制作流程
- 数据算法之二叉树删除(BinaryTreeL Remove)的Java实现
- html5 新属性 (笔记)
- 关于使用虚拟机安装centos发现地址为127.0.0.1,使用Xshell连接不上
- Linux下C文件编译so文件
- 系统之家重装大师使用方法
- iOS开发常用数学函数
- 使用Bitbucketc(GIT)代码托管
- 一个旋钮的Demo
- 对伪心理学说不