二叉搜索树BST



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;
}
posted @ 2018-03-11 10:50  Wakingup  阅读(167)  评论(0编辑  收藏  举报