二叉查找树的元素删除算法
来源:互联网 发布:ubuntu用终端设置中文 编辑:程序博客网 时间:2024/06/06 00:15
BinarySearchTree(BST)删除一个元素稍微有一些复杂,其方法这里做一个总结:
BST的数据结构:
public static class TreeNode<E extends Comparable<E>> { E element; TreeNode<E> left; TreeNode<E> right; public TreeNode(E e) { element = e; }}
算法:删除BST中的一个元素
首先,需要定位包含该元素的结点,及它的父结点。假设current指向二叉树中包含该元素的结点,而parent指向current的父结点。
current可能是parent的左孩子,也可能是右孩子,这里分两种情况:
1. current没有左孩子
这时,只需将该结点的父结点和当前结点的右孩子相连。
如果current.element > parent.element,则parent.right = current,right;
如果current.element < parent.element,则parent.left = current.right。
2. current有一个左孩子
假设rightMost结点指向current的左子树中最大元素的结点,而parentOfRightMost指向rightMost的父结点。这时,rightMost一定没有右孩子,使current.element = rightMost.element,将rightMost.left连在parentOfRightMost.right上。
如果current的左孩子没有右孩子,那么rightMost = current.left,parentOfRightMost = current,这个时候需要rightMost.left和parentOfRightMost.left相连。
public boolean delete(E e) { // TODO Auto-generated method stub TreeNode<E> parent = null; TreeNode<E> current = root; while (current != null) { if (e.compareTo(current.element) < 0) { parent = current; current = current.left; } else if (e.compareTo(current.element) > 0) { parent = current; current = current.right; } else { break; } } if (current == null) { return false; } if (current.left == null) { // case1: current has no left children if (parent == null) { root = current.left; } else { if (e.compareTo(parent.element) < 0) { parent.left = current.right; } else if (e.compareTo(parent.element) > 0) { parent.right = current.right; } } } else { // case2, current has a left child. TreeNode<E> parentOfRightMost = null; TreeNode<E> rightMost = current.left; while (rightMost.right != null) { parentOfRightMost = rightMost; rightMost = rightMost.right; } current.element = rightMost.element; if (parentOfRightMost.right == rightMost) { parentOfRightMost.right = rightMost.left; } else { // Special case: parentOfRightMost == current parentOfRightMost.left = rightMost.left; } } size--; return true; }
0 0
- 二叉查找树的元素删除算法
- 二叉查找树的删除算法
- 算法---二叉树的建立,查找,删除
- 二叉查找树查找指定排名元素的算法
- 二叉查找树的查找,插入,最大/最小值查找,前驱/后续查找,删除算法[java]
- 算法学习----二叉树的查找、 删除、插入、遍历
- 二叉查找树的删除
- 二叉树的查找删除
- 二叉查找树的插入,删除,查找
- 二叉查找树的插入,删除,查找
- 二叉查找树的插入,删除,查找
- 二叉树的查找算法
- 数据结构与算法分析--二叉排序树(二叉查找树,二叉搜索树)的查找、插入和删除操作
- 二叉树查找删除
- 二叉搜索树的查找、插入、删除
- 二叉查找树的删除操作
- 查找二叉树删除节点的操作
- 二叉查找树中节点的删除。
- mac平台wxWidgets编译及测试
- cocos2d-x2.2.4 进度条实现
- linux 内存管理系列1
- poj1503(高精度运算之大数相加)
- STL_set——set::find
- 二叉查找树的元素删除算法
- 查看主板支持最大内存的方法
- ubuntu 14.04 安装后折腾 2 天工作环境配置
- 微博授权后不会跳回应用
- 简单四则运算
- poj3984(迷宫问题)
- Android学习之笔记---WebView的使用
- Win7 x64 VC6无法调试程序的bug解决方法
- POJ3264Balanced Lineup(最基础的线段树)