二叉查找树中节点的包含,插入,删除操作
2018-03-22 21:38
239 查看
二叉查找树
最近在看大话数据结构,遇到二叉查找树,原理上听起来比较简单,但是要实际写代码实现的时候感觉还是有点困难。1. 二叉查找树的定义:
一棵空数,或者是具有如下性质的二叉树:①若左子树不空,则左子树上所有节点的值均小于它根节点上的值。
②若右子树不空,则右子树上所有节点的值均小于它根节点上的值。
③它的左右子树也分别为二叉查找树。
特别注意:二叉查找树一定要满足左子树上的值全部比根节点小,右子树上的值全部比根节点大。
2.二叉查找树的包含:
判断某个节点是否在二叉查找树上,原理实现应该是很容易,将目标值与根节点比较,大于根节点的值,则以根节点的右节点递归,小于根节点的值,则以根节点的左节点递归。相等的时候,则返回正确值。代码实现:public boolean contains(TreeNode t, int key){
if(t == null){
return false;
}
if(t.val < key){
return contains(t.right, key);
}if(t.val > key){
return contains(t.left, key);
}else{
return true;
}
}
3.二叉查找树的最大,最小值:
二叉查找树的最大最小值应该是比较容易实现的,根据定义,最左端的叶子节点上的值即为最小值,最右端的叶子节点上的值即为最大值。(最小值将right改为left即可)代码实现:
非递归实现:public TreeNode findMax(TreeNode t){
if(t == null){
return null;
}
while(t.right != null){
t = t.right;
}
return t;
}递归实现:public TreeNode findMax(TreeNode t){
if(t == null){
return null;
}
if(t.right == null){
return t;
}
return findMax(t.right);
}
4.二叉查找树的插入:
可以想象,插入一个节点,即是在某个节点上面多加一条分支,但是如果树中某个节点的值与其相等的话,则不做任何操作。public TreeNode insert(TreeNode t, int key){if(t == null){
return new TreeNode(key);
}
if(t.val < key){
t.right = insert(t.right, key);
}if(t.val > key){
t.left = insert(t.left, key);
}else{};
return t;
}
5.二叉查找树的删除:
删除是二叉查找树中最为复杂的一个操作,可以分成三种情况来考虑:①若是叶子节点的话,只需要将其赋值为空即可;
②若仅包含左节点或者右节点,则将其左节点或者右节点的值赋给其本身,将左右节点赋值为空;
③若既包含左节点,也包含右节点,则可以通过中序遍历将其前驱(或后继)节点的值赋给其本身,将前驱(后继)
节点删除。
代码实现:
实现一:public TreeNode remove(TreeNode t, int key){
if(t == null){
return null;
}
if(t.val == key){
if(t.left != null && t.right == null){
t = t.left;
}else if(t.right != null && t.left == null){
t = t.right;
}else if(t.right != null && t.left != null){
t.val = findMax(t.left).val;
remove(t.left, t.val);
}else{
t = null;
}
}else if(t.val < key){
t.right = remove(t.right, key);
}else {
t.left = remove(t.left, key);
}
return t;
}实现二:public TreeNode remove1(TreeNode t, int key){
if(t == null){
return t;
}
if(t.val < key){
t.right = remove1(t.right, key);
}else if(t.val > key){
t.left = remove1(t.left, key);
}else if(t.left != null && t.right != null){
t.val = findMin(t.right).val;
t.right = remove1(t.right, t.val);
}else{
t = (t.left != null) ? t.left : t.right;
}
return t;
}实现二中findMin方法为前面二叉查找树的最小值的方法。
实现一和二的区别在于若左右节点均不为空的时候,一个使用的是前驱,一个使用的是后继来代替。
相关文章推荐
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- 双向链表中节点的插入与删除操作
- 二叉排序树(二叉查找树)BST构造,节点插入,节点查找,节点删除(java)
- c# 操作xml文件(插入节点、修改、删除)
- 二叉查找树的操作(插入、删除、查找)
- swift3.0常用操作包含删除字符串(string),更换字符串,插入字符串
- JavaScript之jQuery-3 jQuery操作DOM(查询、样式操作、遍历节点、创建插入删除、替换、复制)
- 二叉查找树的各种操作(插入、删除、查找、遍历)
- 平衡二叉查找树插入节点操作( AVLTree ):旋转、调整平衡
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- 用C语言编写一个包含链表的初始化、插入、删除、查找等基本操作的程序。
- javascript 原生方法对dom节点的操作,创建、添加、删除、替换、插入、复制、移动等操作
- Query节点操作,jQuery插入节点,jQuery删除节点,jQuery Dom操作
- 带头节点循环单链表的操作(创建,保序插入,指定插入,删除指定表元,删除相同元素,统计某元素表元个数)
- JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
- 平衡二叉树操作(查询树高、平衡因子、删除节点、插入节点)
- 数据结构与算法分析--二叉排序树(二叉查找树,二叉搜索树)的查找、插入和删除操作
- 二叉搜索树的相关操作:插入节点,删除节点,排序,查找,最大值,最小值,前序,中序,后序遍历(主要用到递归的方法)
- 二叉查找树节点的查找、插入和删除
- jQuery:节点(插入,复制,替换,删除)操作