二叉搜索树又称二叉排序树,它或者是一棵空树**,或者是具有以下性质的二叉树:
代码实现:
public Node search(int val){
while (root != null){
if(val > root.val){// val>root.val 在右子树查找
root = root.right;
}else if(val < root.val){// val<root.val 在左子树查找
root = root.left;
}else {// val=root.val 返回该节点即可
return root;
}
}
return null;
}
代码实现:
public boolean insert(int val) {
// 当为空树的时候 直接插入val
if(root == null) {
root = new Node(val);
return true;
}
// 当不为空时的时候,进行判断
Node parent = null;
Node child = root;
while (child != null){
// val 较大 寻找右子树
if(child.val < val){
parent = child;
child = child.right;
}else {//val 较小 寻找左子树
parent = child;
child = child.left;
}
}
// 这里 parent的左子树或右子树就可以进行插入,此时进行判断.
if(parent.val < val){
parent.right = new Node(val);
}else {
parent.left = new Node(val);
}
return true;
}
public void remove(int key) {
Node cur = root;
Node parent = null;
while (cur != null){
if(cur.val == key){
//找到要删除的节点 进行删除
removeNode(cur,parent);
}else if(cur.val < key){
parent = cur;
cur = cur.right;
}else {
parent = cur;
cur = cur.left;
}
}
}
public void removeNode(Node cur,Node parent){
if(cur.left == null){ // 情况一
if(cur == root){
root = cur.right;
}else if(cur == parent.left){
parent.left = cur.right;
}else {
parent.right = cur.right;
}
}else if(cur.right == null){ // 情况二
if(cur == root){
root = cur.left;
}else if(cur == parent.right){
parent.right = cur.left;
}else {
parent.left = cur.left;
}
}else { // 情况三
Node targetParent = cur;
Node target = cur.right;
while(target.left != null){
targetParent = target;
target = target.left;
}
cur.val = target.val;
if(target == targetParent.left){
targetParent.left = target.right;
}else {
targetParent.right = target.right;
}
}
}
插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。
对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。
但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树
最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:
最差情况下,二叉搜索树退化为单支树,其平均比较次数为:
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/wwzzzzzzzzzzzzz/article/details/123109124
内容来源于网络,如有侵权,请联系作者删除!