leetcode先刷_Unique Binary Search Trees II

可能没想到,人的简单方法,关于质询的问题提出做。

如何把产生出来的所有的树木?所使用的方法当然是递归,但是有一个致命的问题,假设根节点,然后做一个递归,所以这是非常多的公共树木的根,结果肯定是一团糟。

怎么办?事实上,在思想上先实践的数量目前正在寻求高度统一,先把全部的左右子树都求出来。然后把它们之间的全部组合都连接到一个新建立出来的根节点,既然是分开左右子树。非常easy想到类似二分的思想。每次指定的不是一个位置。而是一个范围。我一開始还想着先把n个数放到数组里面再递归,脱了裤子放屁啊。

通过对算法思想的描写叙述,“先确定左右子树,再加入根节点”。非常easy想到使用类似后序遍历的编码格式。

class Solution {
public:
    vector<TreeNode *> buildTrees(int beg, int end){
        vector<TreeNode *> res, left, right;
        if(beg>end){
            res.push_back(NULL);
            return res;
        }
        for(int i=beg;i<=end;i++){
            left = buildTrees(beg, i-1);
            right = buildTrees(i+1, end);
            for(int j=0;j<left.size();j++){
                for(int k=0;k<right.size();k++){
                    TreeNode *root = new TreeNode(i+1);
                    root->left = left[j];
                    root->right = right[k];
                    res.push_back(root);
                }
            }
        }
        return res;
    }
    vector<TreeNode *> generateTrees(int n) {
        return buildTrees(0, n-1);
    }
};



版权声明:本文博客原创文章,博客,未经同意,不得转载。

posted @ 2015-08-20 21:06  mengfanrong  阅读(161)  评论(0编辑  收藏  举报