private
class node
}
private node root;//二叉查詢樹的根節點
/**
* 獲取整個二叉查詢樹的大小
*@return
*/public
intsize()
/** * 獲取某乙個結點為根結點的二叉查詢樹的大小
*@param x
*@return
*/private
intsize(node x) else
}
/**
* 查詢:通過key獲取value
*@param key
*@return
*/public value get(key key)
/** * 在以 x 為根節點的子樹中查詢並返回key所對應的值,如果找不到就返回null
* 遞迴實現
*@param x
*@param key
*@return
*/private value get(node x, key key)
//鍵值的比較
int cmp = key.compareto(x.key);
if(cmp<0)else
if(cmp>0) else
}/**
* 插入:設定鍵值對
*@param key
*@param value
*/public
void
put(key key, value value)
/** * key如果存在以 x 為根節點的子樹中,則更新它的值;
* 否則將key與value鍵值對插入並建立乙個新的結點.
*@param x
*@param key
*@param value
*@return
*/private node put(node x, key key, value value)
int cmp = key.compareto(x.key);
if(cmp<0)else
if(cmp>0) else
//設定根節點的n屬性
x.n = size(x.left) + size(x.right) + 1;
return x;
}
/**
* 最小鍵
*/public key min()
/** * 返回結點x為root的二叉排序樹中最小key值的node
*@param x
*@return 返回樹的最小key的結點
*/private node min(node x)else
}/**
* 最大鍵
*/public key max()
/** * 返回結點x為root的二叉排序樹中最大key值的node
*@param x
*@return
*/private node max(node x)else
}
/**
* key向下取整
*/public key floor(key key)
return x.key;
}/**
* 以x 為根節點的二叉排序樹,查詢以引數key的向下取整的node
*@param x
*@param key
*@return
*/private node floor(node x, key key)
int cmp = key.compareto(x.key);
if(cmp == 0)
if(cmp < 0)
//向下取整在右子樹,
node t = floor(x.right, key);
if( t!= null)else
}/**
* key向上取整
*/public key ceiling(key key)
return x.key;
}/**
* 以x 為根節點的二叉排序樹,查詢以引數key的向上取整的node
*@param x
*@param key
*@return
*/private node ceiling(node x, key key)
int cmp = key.compareto(x.key);
if(cmp == 0)
if(cmp > 0)
//向上取整在左子樹,
node t = ceiling(x.left, key);
if( t!= null)else
}
/**
* 排名為k的結點的key
*/public key select(int k)
return x.key;
}/**
* 返回排名為k的結點
*@param x 根節點
*@param k 排名
*@return
*/private node select(node x, int k)
int t = size(x.left);//獲取左子樹的節點數
if(t == k) else
if( t+1 == k ) else
if(t>k)else
}/**
* 返回給定鍵key的排名
*/public
intrank(key key)
/** * 在二叉排序樹x上返回key的排名
*@param x
*@param key
*@return
*/private
intrank(node x, key key)
int cmp = key.compareto(x.key);
if(cmp < 0) else
if(cmp>0) else
}
/**
* 刪除鍵值最小結點
*/public
void
deletemin()
/** * 刪除鍵值最小結點
*@param x
*@return 返回新的二叉查詢樹的根節點
*/private node deletemin(node x)
x.left = deletemin(x.left);
x.n = size(x.left) + size(x.right) + 1;
return x;
}/**
* 刪除:鍵值最大結點
*/public
void
deletemax()
/** * 刪除
*@param x
*@return 返回新的二叉查詢樹的根節點
*/private node deletemax(node x)
x.right = deletemax(x.right);
x.n = size(x.left) + size(x.right) + 1;
return x;
}
/**
* 刪除鍵key結點.
*@param key
*/public
void
delete(key key)
/** * 刪除以x為根結點的二叉查詢樹的key鍵的結點
*@param x
*@param key
*@return 新的二叉查詢樹的根節點
*/private node delete(node x, key key)
int cmp = key.compareto(x.key);
if (cmp < 0) else
if(cmp > 0) else
if(x.right == null)
//根節點有左右子樹
node t = x;
//1. 先求出x的右子樹中最小鍵值的結點並讓x指向它.
x = min(t.right);
//2. 將t的右子樹刪除最小的結點之後的根節點返回
x.right = deletemin(t.right);
//3. 將t的左子樹給x的左子樹
x.left = t.left;
}x.n = size(x.left) + size(x.right) + 1;
return x;
}
java實現二叉排序樹
二叉排序樹 非空左子樹的所有鍵值小於其根節點的鍵值 非空右子數的所有鍵值大於其根節點的鍵值 左右子數都是二叉排序樹 建立先是建立一棵樹 然後進行新增節點 比根節點小那麼就放到左子樹 在進行遞迴 比根節點大那麼就放到右子數 在進行遞迴 public void add node node if node...
JAVA 二叉排序樹
二叉排序樹 二叉檢索樹 author lao yang public class binarysearchtree 插入乙個節點,假如已經存在這個值返回 false 否則true param value 節點值 return 插入成功與否 public boolean insert int valu...
二叉排序樹建立 JAVA實現
最近看了一下二叉排序樹的建立,自己寫了一段 用來建立二叉排序樹,給定乙個陣列,對這個陣列中的數字進行建立二叉排序樹。分兩種情況 1 陣列中的數字是隨機的,也就是說沒有順序 eg int a 用這個陣列中的數字建立二叉排序樹,注意這裡的二叉排序樹是隨便的,沒有特殊的要求 比如建立高度最小的二叉排序樹 ...