0、定义及性质
二叉搜索树(BST binary search tree):又叫二叉排序树或者二叉查找树,其满足以下性质
- 非空左子树所有值小于根节点值
- 非空右子树所有值大于根节点值
- 左、右子树都是二叉搜索树
由上可以推出:
- BST最小值一定在最左端端点上,最大值一定在最右端端点上
- 通过二叉树的中序遍历,可以获得由小到大有序排列的序列
1、查找Find
struct TreeNode* Find(struct TreeNode* root,ElementType x) {
if (root==NULL) return NULL;
if (x < root->val)
root->left=Find(root->left,x);
else if (x > root->val)
root->right=Find(root->right,x);
else
return root;
}
2、查找最大/最小值find Max/find Min
struct TreeNode* findMin(struct TreeNode* root) {
if (root==NULL) return NULL;
while (root->left)
root=root->left;
return root;
}
struct TreeNode* findMax(struct TreeNode* root) {
if (root==NULL) return NULL;
while (root->right)
root=root->right;
return root;
}
3、插入Insert
//这里使用递归插入,还是比较巧妙
struct TreeNode* Insert(struct TreeNode* root,ElementType x) {
if (root==NULL) {
struct TreeNode* root=(struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val=x;
root->left=root->right=NULL;
}
else {
if (x < root->val){
root->left=Insert(root->left,x);
}
else if (x > root->val) {
root->right=Insert(root->right,x);
}
}
return root;
}
4、删除delete
struct TreeNode* findMin(struct TreeNode* root) {
if (root==NULL) return NULL;
while (root->left)
root=root->left;
return root;
}
struct TreeNode* delete(struct TreeNode* root,ElementType x) {
if (root==NULL) return NULL;
//左、右子树分别递归删除
else if (x < root->val) {
root->left=delete(root->left,x);
}
else if (x > root->val) {
root->right=delete(root->right,x);
}
else {
//找到要删除的点
//找到改点右子树的最小节点temp,并赋值给当前的root
//然后递归删除掉temp
if (root->left&&root->right) {
struct TreeNode* temp=findMin(root->right);
root->val=temp->val;
root->right=delete(root->right,temp->val);
}
else {
//只有右儿子、无子节点
//只有左儿子、无子节点
struct TreeNode* temp=root;
if (root->left==NULL)
root=root->right;
else if (root->right==NULL)
root=root->left;
free(temp);
}
}
return root;
}