码迷,mamicode.com
首页 > 其他好文 > 详细

二叉搜索树BST

时间:2018-03-11 14:34:24      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:最大值   遍历   比较   最大   roo   free   treenode   post   down   




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;
}

二叉搜索树BST

标签:最大值   遍历   比较   最大   roo   free   treenode   post   down   

原文地址:https://www.cnblogs.com/WakingUp/p/8543443.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!