zoukankan      html  css  js  c++  java
  • 二叉树总结(三)二叉搜索树

    二叉搜索树

    对于二叉树,假设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

  • 相关阅读:
    ARM板卡ftp客户端应用
    vsftp移植(待续)
    /dev/null脚本中作用
    amazeui.css
    将td中文字过长的部分变成省略号显示的小技巧
    div非弹出框半透明遮罩实现全屏幕遮盖css实现
    重新定位svn地址的方法(windows和linux),svn switch(sw)的帮助信息
    linux 下启动SVN服务
    用SVN checkout源码时,设置账号
    svn提示out of date
  • 原文地址:https://www.cnblogs.com/yeqluofwupheng/p/7429375.html
Copyright © 2011-2022 走看看