• 二叉搜索树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;
    }
    
  • 相关阅读:
    SQLSERVER 数据连接字符串
    c#中 间隔两个小时执行一次
    移动开发者的自学宝典:十大在线编程学习网站
    C#j将DataTable转换成List
    C#将list转换为datatable
    SQL Server 高性能写入 摘抄
    解决控制面板删除不了的程序卸载
    卸载SQL 2008 R2 出现警告26003
    删除重复数据
    大数据量数据优化
  • 原文地址:https://www.cnblogs.com/WakingUp/p/8543443.html
Copyright © 2020-2023  润新知