1、结点的构造
struct BSTnode {
int key;
BSTnode* left;
BSTnode* right;
BSTnode(int K) {
key = K;
left = right = NULL;
}
};
2、查找算法
2.1 递归版本
BSTnode* Search(BSTnode* root, int K) {
if (root == NULL || root->key == K) return root;
if (K < root->key) return Search(root->left, K);
else return Search(root->right, K);
}
例题:LeetCode 700
2.2 迭代版本
BSTnode* Search2(BSTnode* root, int K) {
BSTnode* p = root;
while (p != NULL) {
if (K < p->key) p = p->left;
else if (K > p->key) p = p->right;
else return p;
}
return NULL;
}
3、插入算法
3.1 引用传值
void insert(BSTnode* &root, int K) {
if (root == NULL) root = new BSTnode(K);
else if (K < root->key) insert(root->left, K);
else if (K > root->key) insert(root->right, K);
}
3.2 值传递
BSTnode* Insert(BSTnode* root, int K) {
if (root == NULL) root = new BSTnode(K);
else if (K < root->key) root->left = Insert(root->left, K);
else if (K > root->key) root->right = Insert(root->right, K);
return root;
}
例题:LeetCode 701
4、删除算法
4.1 引用传值
void remove(BSTnode* &root, int K) {
if (root == NULL) return;
if (K < root->key) remove(root->left, K);
else if (K > root->key) remove(root->right, K);
else if (root->left != NULL && root->right != NULL) {
BSTnode* s = root->right;
while(s->left != NULL){
s = s->left;
}
root->key = s->key;
remove(root->right, s->key);
}
else {
BSTnode* oldroot = root;
root = (root->left != NULL) ? root->left : root->right;
delete oldroot;
}
}
4.2 值传递
BSTnode* deleteNode(BSTnode* root, int K) {
if (root == NULL) return root;
if (K < root->key) {
root->left = deleteNode(root->left, K);
}
else if (K > root->key) {
root->right = deleteNode(root->right, K);
}
else if (root->left != NULL && root->right != NULL) {
BSTnode* s = root->right;
while(s->left != NULL){
s = s->left;
}
root->key = s->key;
root->right = deleteNode(root->right, s->key);
}
else {
BSTnode* oldroot = root;
root = (root->left != NULL) ? root->left : root->right;
delete oldroot;
}
return root;
}
例题:LeetCode 450
5、统计由n个结点组成且结点关键词为1到n的二叉查找树有多少种
int numTrees(int n) {
long long C = 1;
for (int i = 2; i <= n; i++) {
C = C * 2 * (2 * i - 1) / (i + 1);
}
return C;
}
例题:LeetCode 96