数据算法之二叉树删除(BinaryTreeL Remove)的Java实现
2017-05-08 00:00
267 查看
本文的代码来自于《数据结构与算法(JAVA语言版)》,是笔者在网上找到的资料,非正式出刊版物。笔者对代码一些比较难以理解的部分添加了注释和图解,欢迎大家来讨论。
二叉树删除要分为三种情况。
第一种:如果为叶子结点,则可以直接删除,如图一。
第二种:如果只有左子树或者只有右子树的时候,只要令其左子树或右子树为其父节点的左子树或右子树即可,如图二。
第三种:如果节点既有左节点,又有右节点,则我们需要先用中序序列中节点的前驱或后序替换该节点,然后删除其前驱或后序节点。此时该节点的前驱或后序节点必然是没有右孩子或者左孩子的节点,删除方法可以参照第二种,如图三。
输入:待删除元素ele
输出:在二叉查找树中删除ele
代码:
二叉树删除要分为三种情况。
第一种:如果为叶子结点,则可以直接删除,如图一。
第二种:如果只有左子树或者只有右子树的时候,只要令其左子树或右子树为其父节点的左子树或右子树即可,如图二。
第三种:如果节点既有左节点,又有右节点,则我们需要先用中序序列中节点的前驱或后序替换该节点,然后删除其前驱或后序节点。此时该节点的前驱或后序节点必然是没有右孩子或者左孩子的节点,删除方法可以参照第二种,如图三。
输入:待删除元素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(); }
相关文章推荐
- 数据算法之二叉树删除(BinaryTreeL Remove)的Java实现
- 数据算法之二叉树插入(BinaryTreeL Insert)的Java实现
- 数据算法之二叉树插入(BinaryTreeL Insert)的Java实现
- 数据算法之二叉树查找(BinaryTreeL Search)的Java实现
- 【LeetCode-面试算法经典-Java实现】【144-Binary Tree Preorder Traversal(二叉树非递归前序遍历)】
- 【LeetCode-面试算法经典-Java实现】【145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)】
- 【LeetCode-面试算法经典-Java实现】【107-Binary Tree Level Order Traversal II(二叉树层序遍历II)】
- 【LeetCode-面试算法经典-Java实现】【144-Binary Tree Preorder Traversal(二叉树非递归前序遍历)】
- 【LeetCode-面试算法经典-Java实现】【111-Minimum Depth of Binary Tree(二叉树的最小深度)】
- 【LeetCode-面试算法经典-Java实现】【145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)】
- 【LeetCode-面试算法经典-Java实现】【114-Flatten Binary Tree to Linked List(二叉树转单链表)】
- 【LeetCode-面试算法经典-Java实现】【107-Binary Tree Level Order Traversal II(二叉树层序遍历II)】
- 【LeetCode-面试算法经典-Java实现】【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】
- 【LeetCode-面试算法经典-Java实现】【026-Remove Duplicates from Sorted Array(删除排序数组中的重复元素)】
- 【LeetCode-面试算法经典-Java实现】【199-Binary Tree Right Side View(从右边看二叉树)】
- 【LeetCode-面试算法经典-Java实现】【114-Flatten Binary Tree to Linked List(二叉树转单链表)】
- 【LeetCode-面试算法经典-Java实现】【083-Remove Duplicates from Sorted List(排序的单链表中删除重复的结点)】
- 【LeetCode-面试算法经典-Java实现】【104-Maximum Depth of Binary Tree(二叉树的最大深度)】
- 【LeetCode-面试算法经典-Java实现】【199-Binary Tree Right Side View(从右边看二叉树)】
- 【LeetCode-面试算法经典-Java实现】【102-Binary Tree Level Order Traversal(二叉树层序遍历)】