LeetCode--Unique Binary Search Trees II(DP求BST)

題意:Given n, generate all structurally unique BST’s (binary search trees) that store values 1…n.
For example,
Given n = 3, your program should return all 5 unique BST’s shown below.

1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3

題解:此題在Unique Binary Search Trees基礎上進一步加大了難度,因爲要求爲BST,則假若生成一顆有i個節點的樹,根節點爲j+1,則根節點的左子樹節點肯定爲[1,j],而根節點的右子樹的節點肯定爲[j+2,i]。
我們利用Unique Binary Search Trees中動態規劃中的一些技巧,設ans[i]中包含了所有規模爲i的不同BST的根節點。

  1. 對於規模爲i的BST,我們枚舉它所有可能的根節點[1,i]。
  2. 若根節點爲j+1,由上面的分析可知我們已經知道了左子樹即規模爲j的所有BST:ans[j],則直接枚舉將它接在根節點的左子樹即可。
  3. 而右子樹規模爲i-1-j,但是其節點上的key值應該爲[j+2,i],所以我們不能直接枚舉ans[i-1-j]的所有根節點將它接在右子樹上,我們需要生成一顆新的規模爲i-1-j的子樹,並且將它的所有key值加上j+1。

代碼如下:

class Solution {
public:
    TreeNode* addVal(TreeNode* now,int add)
    //將樹中的每個節點加上一個固定值add,生成一顆新樹
    {
        if(now == NULL)
            return NULL;
        TreeNode* newNode = new TreeNode((now->val)+add);
        newNode->left = addVal(now->left,add);
        newNode->right = addVal(now->right,add);
        return newNode;
    }
    vector<TreeNode *> generateTrees(int n) {
        vector<vector<TreeNode*> > ans;
        ans.clear();
        ans.resize(n+1);
        ans[0].push_back(NULL);
        if(n == 0)
            return ans[0];
        ans[1].push_back(new TreeNode(1));
        for(int i = 2;i <= n;i++)
        //總共有i個節點的BST
        {
            for(int j = 0;j < i;j++)
            //根節點爲j+1
            {

                for(int k = 0;k < ans[j].size();k++)
                //根節點的左子樹爲節點[1,j]
                {
                    for(int m = 0;m < ans[i-1-j].size();m++)
                    //根節點的右子樹爲節點[j+2,i],相當於在子樹[1,i-1-j]的每個節點val值加上j+1
                    {
                        TreeNode* newNode = new TreeNode(j+1);
                        newNode->left = ans[j][k];
                        newNode->right = addVal(ans[i-1-j][m],j+1);
                        ans[i].push_back(newNode);
                    }
                }
            }
        }
        return ans[n];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章