Unique Binary Search Trees II

来源:互联网 发布:宝宝哭声辨别软件 编辑:程序博客网 时间:2024/05/01 03:17
/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    void buildTree(int& start,int& cnt,TreeNode* root,const TreeNode* prototype)    {        if(prototype->left!=NULL)        {            TreeNode* left=new TreeNode(0);            buildTree(start,cnt,left,prototype->left);            root->left=left;        }        root->val=start++;        if(prototype->right!=NULL)        {            TreeNode* right=new TreeNode(0);buildTree(start,cnt,right,prototype->right);            root->right=right;        }    }    vector<TreeNode *> generateTrees(int n) {        vector<vector<TreeNode*> > dp(n+1,vector<TreeNode*>());        dp[0].push_back(NULL);if(n==0){return dp[0];}        TreeNode* root1=new TreeNode(1);        dp[1].push_back(root1);if(n==1){return dp[1];}        for(int i=2;i<=n;++i)        {            //enum left sub tree nodes count            for(int j=0;j<i;++j)            {                vector<TreeNode*> leftSubTree=dp[j];                vector<TreeNode*> rightSubTree=dp[i-j-1];                for(int a=0;a<leftSubTree.size();++a)                {                    for(int b=0;b<rightSubTree.size();++b)                    {                        TreeNode* root=new TreeNode(j+1);                        if(leftSubTree[a]!=NULL)                        {                            TreeNode* left=new TreeNode(0);                            int start1=1;                            int cnt1=j;                            buildTree(start1,cnt1,left,leftSubTree[a]);                            root->left=left;                        }                        if(rightSubTree[b]!=NULL)                        {                            TreeNode* right=new TreeNode(0);                            int start2=j+2;                            int cnt2=i-j-1;                            buildTree(start2,cnt2,right,rightSubTree[b]);                            root->right=right;                        }                        dp[i].push_back(root);                    }                }            }        }        return dp[n];    }};


最关键的在于要注意深拷贝,否则指针就指的乱套了。其次要注意在构建树时,虽然可以直接利用之前构建好的树的结构,但是新构建的树中每个节点需要填的值是不能直接利用之前构建好的树中的值,需要在构建过程中重建。

0 0
原创粉丝点击