• 二叉搜索树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;
    }
    
  • 相关阅读:
    C3P0的详细配置说明
    关于commons-fileupload组件上传文件中文名乱码问题
    手写JDBC
    使用try-with-resource遇到的问题
    Java基础学习总结——Java对象的序列化和反序列化
    IDEA查看第三方jar包的源代码时出现Decompiled.class file, bytecode version:52.0 (Java 8)的解决方案
    软件工程课程周进度报告 第六周
    地铁合作的第二周
    第六周进度总结
    地铁合作的第一周
  • 原文地址:https://www.cnblogs.com/WakingUp/p/8543443.html
Copyright © 2020-2023  润新知