生成所有二叉搜索樹

生成所有二叉搜索樹

題目見 leetcode-cn unique-binary-search-tree-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]
]

思路

本來想用回溯,但是覺得太複雜,就去看了題解。
從Catalan數的一個定義出發,來對每一個根 i,遞歸生成對應的左子樹1i-1和右子樹i+1n,再得到所有組合的樹,就很好理解和實現。參考了題解的java寫的如下C++代碼。

C++代碼

/**
 * 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 {
    vector<TreeNode*> generate(int start, int end) {
        vector<TreeNode*> all;
        if (start>end) {
            all.push_back(nullptr);
            return all;
        }
        for (int i=start;i<=end;i++) {
            vector<TreeNode*> left=generate(start,i-1);
            vector<TreeNode*> right=generate(i+1,end);
            for (auto l:left) {
                for (auto r:right) {
                    TreeNode* node=new TreeNode(i);
                    node->left=l;
                    node->right=r;
                    all.push_back(node);
                }
            }
        }
        return all;
    }
public:
    vector<TreeNode*> generateTrees(int n) {
        if (n==0) return vector<TreeNode*>();
        return generate(1,n);
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章