二叉搜索树BST

Posted wakingup

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉搜索树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;
}


















以上是关于二叉搜索树BST的主要内容,如果未能解决你的问题,请参考以下文章

C++ 实现二叉排序树(搜索树BST)(完整代码)

树--05---二叉树--02---二叉搜索树(BST)遍历

二叉搜索树(BST)---python实现

python实现二叉搜索树_二叉搜索树(BST)---python实现

树--04---二叉树--01---简介二叉搜索树(BST)实现

[leetcode]450. Delete Node in a BST二叉搜索树删除节点