leetcode95. 不同的二叉搜索树 II

给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树

示例:

输入: 3
输出:
[
  [1,null,3,2],
  [3,2,null,1],
  [3,1,null,null,2],
  [2,1,3],
  [1,null,2,null,3]
]
解释:
以上的输出对应以下 5 种不同结构的二叉搜索树:

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

解题思路:

先码住........有空了再来好好想想......

class Solution {
public:
    
    vector<TreeNode*> generateTrees(int n) {
       vector<TreeNode*> t; 
       if(n==0)
       {
           return t;
       }
          
       return f(1,n);
};
    
    vector<TreeNode*> f(int l,int r)
    {
       vector<TreeNode*> ans;
        
       if(l>r)
       {
           ans.push_back(NULL);
       }
       
       for(int k=l;k<=r;k++)
       {
          vector<TreeNode*> left=f(l,k-1);
          vector<TreeNode*> right=f(k+1,r);
          
          for(int i=0;i<left.size();i++)
          {
              for(int j=0;j<right.size();j++)
              {
                  TreeNode *temp=new TreeNode(k);
                  temp->left=left[i];
                  temp->right=right[j];
                  ans.push_back(temp);
              }
          }
       }
        
      return ans;
    }
};

最开始的思路.......

class Solution {
public:
    vector<TreeNode*> ans;
    int mark[100000]={0};
    vector<TreeNode*> generateTrees(int n) {
    for(int i=1;i<=n;i++)
    {
        memset(mark,0,sizeof(mark));
        TreeNode* root=new TreeNode(i);
        mark[i]=1;
        ans.push_back(root);
        f(root,n);
    }
      return ans;
};
    void f(TreeNode* root,int n)
    {
        if(root==NULL)
        {
            ans.push_back(root);
            return;
        }
        for(int j=1;j<=n;j++)
        {
            if(mark[j]==1)
                continue;
            if(j<root->val)
            {
                mark[j]=1;
                root->left=new TreeNode(j);
                ans.push_back(root->left);
                f(root->left,n);
            }
            else if(j>root->val)
            {
                mark[j]=1;
                root->right=new TreeNode(j);
                ans.push_back(root->right);
                f(root->right,n);
            }
        }
    }
};

猜你喜欢

转载自blog.csdn.net/zhuixun_/article/details/80558963