二叉查找树
记录自己的学习过程,如果其中有什么错误欢迎各位大佬指正。
二叉查找树,又叫二叉搜索树,二叉排序树。他是一种特殊的二叉树,为提高查找效率而诞生的数据结构。
二叉查找树的特征
- (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- (3)左、右子树也分别为二叉查找树;
- (4)没有键值相等的结点。
二叉查找树种的查找
由于二叉查找树的特性左子树上的节点永远小于根节点,右子树的节点永远大于根节点,那么在找寻一个节点的时候可以根据大小来决定查找的方向,具体如图:
二叉查找树的添加
添加都时添加在叶子节点上的,只要在查找到合适的叶子节点在对应的位置加上要添加的节点就行。
二叉查找树的删除
相对于查找和添加来说,删除的实现稍微优点复杂,先分为两种情况:
一. 删除的不是根节点
删除的是普通节点时,又可以分为三种情况:
第一种情况:当要删除节点的左子树和右子树都不为空时,因为二叉查找树的所有子树其实也是二叉查找树,所以我们可以将左子树的最大值或者右子树的最小值与该节点替换,为什么是这两个值?因为只有这两个值在根节点上才能满足左节点的所有节点均小于根节点和右节点的所有节点均大于根节点这两种性质。这里我们用右子树的最小值来举例,如图:
先找到右子树种最小值
然后与要删除的节点替换,再移除右子树的最小值就OK
最后得到
第二种情况:只存在左子树或者右子树,这种情况我们直接将要删除节点的父节点断开该节点的链接指向该节点的左子树或者右子树就行了
最后得到
第三种情况:当删除节点为叶子节点时,这种情况就很简单了,直接删除就行了。
二. 删除的是根节点
删除的是根节点这种情况,又要分三种小情况:
其实删除根节点和删除普通节点区别不大,极少的区别就是在只有左子树和右子树时时用左子树和右子树直接替代整个树就可以了;还有就是不用操作父节点因为并不存在。
Java代码实现
树节点类
public class TreeNode {
private TreeNode parent;
private TreeNode left;
private TreeNode right;
private int val;
public TreeNode() {
}
public TreeNode(TreeNode parent, TreeNode left, TreeNode right, int val) {
this.parent = parent;
this.left = left;
this.right = right;
this.val = val;
}
public TreeNode getParent() {
return parent;
}
public void setParent(TreeNode parent) {
this.parent = parent;
}
public TreeNode getLeft() {
return left;
}
public void setLeft(TreeNode left) {
this.left = left;
}
public TreeNode getRight() {
return right;
}
public void setRight(TreeNode right) {
this.right = right;
}
public int getVal() {
return val;
}
public void setVal(int val){
this.val = val;
}
}
二叉查找树类
public class BinSearchTree {
TreeNode root;
public BinSearchTree(TreeNode root) {
this.root = root;
}
public