zoukankan      html  css  js  c++  java
  • 二叉搜索树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;
    }
    
  • 相关阅读:
    有用的java工具
    AOP在大规模软件开发项目中的应用(图)
    java并发编程实践笔记
    深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题
    JVM相关问答
    软件架构设计的六大原则
    JVM 运行时数据区域
    JVM 类加载过程
    JVM 垃圾回收算法
    Memcached内存分配优化及使用问题
  • 原文地址:https://www.cnblogs.com/WakingUp/p/8543443.html
Copyright © 2011-2022 走看看