华为云直播课上的二叉查找树实现
回放地址:
https://bbs.huaweicloud.com/live/edu_live/202108261900.html
package com.main.java;
import com.sun.jdi.Value;
import org.w3c.dom.Node;
import java.security.Key;
import java.util.List;
/**
* explain:
*
* @Author Lynn
* @Date 2021/8/27
**/
public class BinaryTree<Key extends Comparable<Key>, Value> {
private Node root;
private int num;
/**
* 节点类
*/
class Node{
//储存键
private Key key;
//储存值
private Value value;
//左子节点
private Node left;
//右子节点
private Node right;
public Node(Key key, Value value, Node left, Node right){
this.key = key;
this.value = value;
this.left = left;
this.right = right;
}
@Override
public String toString(){
return "Node{" +
"key=" + key +
", value=" + value +
", left=" + left +
", right=" + right +
"}";
}
}
//获取树中元素的个数
public int size(){
return num;
}
//添加元素
public void put(Key key, Value value){
root = put(root, key, value);
}
//向指定的树中添加 k-v,并返回添加元素后的新的树
public Node put(Node x,Key key, Value value){
//如果x子树为空
if (x == null){
num++;
return new Node(key, value, null, null);
}
//如果x子树不为空
//比较x节点的键和key的大小
int cmp = key.compareTo(x.key);
if (cmp > 0){
//如果key大于x节点键
x.right = put(x.right, key, value);
}else if (cmp < 0){
//小于x节点的键
x.left = put(x.left, key, value);
}else {
//等于x节点的键
x.value = value;
}
return x;
}
//查询树中指定key对应的value
public Value get(Key key){
return get(root, key);
}
//从指定的树x中,查询key对应的值
public Value get(Node x, Key key){
if (x == null){
return null;
}
int cmp = key.compareTo(x.key);
if (cmp > 0){
//如果key大于x节点键
return get(x.right, key);
}else if (cmp < 0){
//小于x节点的键
return get(x.left, key);
}else {
//等于x节点的键
return x.value;
}
}
//删除树中key对应的value
public Node delete(Node x, Key key){
//x树为null
if (x == null){
return null;
}
//x树不为null
int cmp = key.compareTo(x.key);
if (cmp > 0){
//如果key大于x节点键
x.right = delete(x.right, key);
}else if (cmp < 0){
//小于x节点的键
x.left = delete(x.left, key);
}else {
//等于x节点的键,完成真正的节点删除操作
num--;
if (x.right == null){
return x.left;
}
if (x.left == null){
return x.right;
}
//找到右子树中最小的子树
Node minNode = x.right;
while (minNode.left != null){
minNode = minNode.left;
}
//删除最小的节点
Node n = x.right;
while (n.left != null){
if (n.left.left == null){
n.left = null;
}else {
n = n.left;
}
}
//让x节点的左子树成为最小节点的左子树
minNode.left = x.left;
//让x节点的右子树成为最小节点的右子树
minNode.right = x.right;
//让x节点的父节点指向minNode节点
x = minNode;
}
return x;
}
//查找整个树中最小的键
public Key min(){
return min(root);
}
//在指定树x中找出最小键所在的节点
public Key min(Node x){
while (x.left != null) {
x = x.left;
}
Key minKey = x.key;
return minKey;
}
//整个树中找到最大的键
public Key max(){return null;}
//在指定树x中,找到最大的键所在节点
public Node max(Node x){return null;}
}