二叉樹總結(三)二叉搜索樹

二叉搜索樹html

對於二叉樹,假設x爲二叉樹中的任意一個結點,x節點包含關鍵字key,節點x的key值記爲key[x]。若是y是x的左子樹中的一個結點,則key[y] <= key[x];若是y是x的右子樹的一個結點,則key[y] >= key[x]。那麼,這棵樹就是二叉查找樹。node

性質spa

  • 若任意節點的左子樹不空,則左子樹上全部結點的值均小於它的根結點的值;
  • 任意節點的右子樹不空,則右子樹上全部結點的值均大於它的根結點的值;
  • 任意節點的左、右子樹也分別爲二叉查找樹。
  • 沒有鍵值相等的節點(no duplicate nodes)。

 由上面的性質很容易看出來,二叉查找樹的中序遍歷是一個增序的序列。所以,二叉搜索樹的最小值是在最左邊,最大值是在最右邊。code

二叉樹的插入htm

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;
}

二叉樹的刪除blog

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)。遞歸

二叉搜索樹的應用element

95 Unique Binary Search Trees II  列出節點值爲[1,n]的全部可能二叉搜索樹get

解決方法參考下面博文:http://www.cnblogs.com/yeqluofwupheng/p/6755645.html
96 Unique Binary Search Trees  找到節點值爲[1,n]的全部可能二叉搜索樹的數量class

解決方法參考下面博文: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 BST235 Lowest Common Ancestor of a Binary Search Tree255 Verify Preorder Sequence in Binary Search Tree270 Closest Binary Search Tree Value272 Closest Binary Search Tree Value II285 Inorder Successor in BST333 Largest BST Subtree449 Serialize and Deserialize BST450 Delete Node in a BST501 Find Mode in Binary Search Tree530 Minimum Absolute Difference in BST538 Convert BST to Greater Tree653 Two Sum IV - Input is a BST

相關文章
相關標籤/搜索