二叉排序树的建立
二叉排序树的定义与描述:
- 若它的左子树非空,则左子树上所有的结点的值均小于根节点的值;
- 若它的右子树非空,则右子树上所有结点的值均大于或等于根节点的值;
- 它的左右子树也分别为二叉排序树。这是一个递归定义。
数据的表示 - 嵌套定义一个私有类来表示二叉查找树上的一个结点。
- 每个结点都含有一个键、一个值、一条左链接、一条右链接、和一个结点计数器
二叉排序树的构造:
private Node root;
private class Node{
//键
private Key key;
//值
private Value val;
//指向子树的链接
private Node left, right;
//以该结点为根的子树的节点总数
private int N;
public Node(Key key, Value val, int N) {
this.key = key;
this.val = val;
this.N = N ;
}
查找:
//在以x为根节点的子树中查找并返回key所对应的值
//找不到返回空
private Value get(Node x, Key key) {
if(x == null ) {
return null;
}
int cmp = key.compareTo(x.key);
if(cmp < 0) {
return get(x.left, key);
}else if(cmp > 0) {
return get(x.right, key);
}else {
return x.val;
}
}
插入:
//如果key存在与以x为结点的子树中则更新它的值
//否则将以key和val为键值对的新节点插入到该子树中;
private Node put(Node x, Key key, Value val) {
if( x == null) {
return new Node(key, val, 1);
}
int cmp = key.compareTo(x.key);
if(cmp < 0) {
x.left = put(x.left, key, val);
}else if(cmp > 0) {
x.right = put(x.right, key,val);
}else {
x.val = val;
}
x.N = size(x.left) + size(x.right) + 1;
return x;
}
本文参考自《算法(第四版)》韦恩
代码链接