Leetcode 95不同的二叉搜索树II C++

思路:参考http://www.cnblogs.com/grandyang/p/4301096.html
自己的理解:在递归函数generateTreesDFS中subTree用的都是指针是为了形成动态数组。else里面,以i为节点的数,左子树的范围都必须比i小即为代码中的vector<TreeNode*> leftsubTree=generateTreesDFS(start,i-1);右子树都必须比i大,即为代码中的
vector<TreeNode
> *rightsubTree=generateTreesDFS(i+1,end);
最里面的两个循环是将所有以i为节点的左右子树的可能情况进行合成。
注意:不是最后才将所有的结果合成的,而是从递归函数的最底端,将可能的情况合成,然后再上升到上一层的递归函数,再将可能的情况合成,直到最上层的递归函数。这也就是为什么subtree、*leftsubTree、*rightsubTree都是动态数组的原因了。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<TreeNode*> generateTrees(int n) {
        if(n<1) return{};
        return *generateTreesDFS(1,n);   
    }
    vector<TreeNode*> *generateTreesDFS(int start,int end)
    {
        vector<TreeNode*> *subTree=new vector<TreeNode*>();
        if(start>end) subTree->push_back(NULL);
        else
        {
            for(int i=start;i<=end;++i)
            {
                vector<TreeNode*> *leftsubTree=generateTreesDFS(start,i-1);
                vector<TreeNode*> *rightsubTree=generateTreesDFS(i+1,end);
                for(int j=0;j<leftsubTree->size();++j)
                    for(int k=0;k<rightsubTree->size();++k)
                    {
                        TreeNode*node=new TreeNode(i);
                        node->left=(*leftsubTree)[j];
                        node->right=(*rightsubTree)[k];
                        subTree->push_back(node);
                    }
            }
        }
        return subTree;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_43387999/article/details/87736807