• 二叉树总结(三)二叉搜索树


    二叉搜索树

    对于二叉树,假设x为二叉树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个结点,则key[y] <= key[x];如果y是x的右子树的一个结点,则key[y] >= key[x]。那么,这棵树就是二叉查找树。

    性质

    • 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    • 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
    • 任意节点的左、右子树也分别为二叉查找树。
    • 没有键值相等的节点(no duplicate nodes)。

     由上面的性质很容易看出来,二叉查找树的中序遍历是一个增序的序列。因此,二叉搜索树的最小值是在最左边,最大值是在最右边。

    二叉树的插入

    TreeNode *bstInsert(int val, TreeNode *root){
        if (!root){
            return new TreeNode(val);
        }
        else if (root->val > val){
            root->left = bstInsert(val, root->left);
        }
        else if(root->val < val) {
            root->right = bstInsert(val, root->right);
        }
        return root;
    }

    二叉树的删除

    TreeNode *bstDelete(int val, TreeNode *root){
        if (!root){
            cout << "element not found" << endl;
            return nullptr;
        }
        else if (root->val > val){
            root->left = bstDelete(val, root->left);
        }
        else if(root->val < val) {
            root->right = bstDelete(val, root->right);
        }
        else{//为root节点时
            //首先找到右子树的最小值或者左子树的最大值
            if (root->left && root->right){
                TreeNode *pa = nullptr;
                TreeNode *rp = root->right;
                while (rp->left){
                    pa = rp;//保存最小值点的父节点
                    rp = rp->left; //找到右子树的最小值
                }
                root->val = rp->val;//将该最小值替换到root
                //父节点不为空,则最小值节点为其左子树
                if (pa)    pa->left = bstDelete(rp->val, rp);//递归删除该最小值节点
                else root->right = bstDelete(rp->val, rp);//否则,是root的右孩子
            }
            else{//左右子树有一个为空,则可以直接删除根节点
                TreeNode *p = root;
                if (!root->left)root = root->right;
                else if (!root->right)root = root->left;
                else root = nullptr;
                delete p;
            }
        }
        return root;
    }

    从插入删除操作可以看出,同一个元素在二叉搜索树中删除后再插入位置可能不一样;而且二叉搜索树多次插入删除后,可能会出现树枝偏向一边,即根节点的一边的子树节点很少,另一边节点很多,这种不平衡的状态。因此,它的查找复杂度最坏可能是O(n)。

    二叉搜索树的应用

    95 Unique Binary Search Trees II  列出节点值为[1,n]的所有可能二叉搜索树

    解决方法参考下面博文:http://www.cnblogs.com/yeqluofwupheng/p/6755645.html
    96 Unique Binary Search Trees  找到节点值为[1,n]的所有可能二叉搜索树的数量

    解决方法参考下面博文:http://www.cnblogs.com/yeqluofwupheng/p/6661393.html
    98 Validate Binary Search Tree   判断一个二叉搜索树是否合法

    解决方法参考下面博文:
    99 Recover Binary Search Tree


    108 Convert Sorted Array to Binary Search Tree


    109 Convert Sorted List to Binary Search Tree


    173 Binary Search Tree Iterator


    230 Kth Smallest Element in a BST
    235 Lowest Common Ancestor of a Binary Search Tree
    255 Verify Preorder Sequence in Binary Search Tree
    270 Closest Binary Search Tree Value
    272 Closest Binary Search Tree Value II
    285 Inorder Successor in BST
    333 Largest BST Subtree
    449 Serialize and Deserialize BST
    450 Delete Node in a BST
    501 Find Mode in Binary Search Tree
    530 Minimum Absolute Difference in BST
    538 Convert BST to Greater Tree
    653 Two Sum IV - Input is a BST

  • 相关阅读:
    湖南省队集训 Day 2
    一句话题解(~ 2020.4.9)
    NOIP 2017 宝藏
    NOIP 2017 逛公园
    bzoj 4767 两双手
    Codeforces Gym 101623E English Restaurant
    浅谈Tarjan算法
    Codeforces 1027F Session in BSU
    Codeforces Gym 101623A Ascending Photo
    2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror) Solution
  • 原文地址:https://www.cnblogs.com/yeqluofwupheng/p/7429375.html
Copyright © 2020-2023  润新知