天天看點

LeetCode_95_不同的二叉搜尋樹 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      
/**
 * 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*> ans(int start,int end){//周遊根從start開始到end結束
        vector<TreeNode*> res;
        if(start>end){
            res.push_back(NULL);//在此注意,當樹為空時,必須要添加NULL進樹
            return res;
        }
        for(int i=start;i<=end;i++){
            vector<TreeNode*> lefts=ans(start,i-1);//左子樹集合
            vector<TreeNode*> rights=ans(i+1,end);//右子樹集合
            for(auto left:lefts){//對左右子樹進行組合
                for(auto right:rights){
                    TreeNode* root=new TreeNode(i);//申請新的根節點,并且給根節點指派為i
                    root->left=left;
                    root->right=right;
                    res.push_back(root);
                }
            }
        }
        return res;
    }
    
    vector<TreeNode*> generateTrees(int n) {
        if(n==0)//沒有節點,傳回空樹
            return vector<TreeNode*>();
        return ans(1,n);
    }
};