生成所有可能的二叉排序树 Unique Binary Search Trees II

来源:互联网 发布:win7 ubuntu 安装教程 编辑:程序博客网 时间:2024/04/19 17:32
问题:Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.

For example, Given n = 3, your program should return all 5 unique BST's shown below.

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

可参考: 构成的二叉查找树的个数 Unique Binary Search Trees

思路:对于每一个新的变化,都需要重新产生所有的结点。最终要的是根节点。采用的是backtrack方法。

/** * Definition for binary tree * 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) {        vector<TreeNode *> result;        if(n == 0)        {            result.push_back(NULL);            return result;        }                    return generate(1, n);    }        vector<TreeNode *> generate(int l, int r)    {        vector<TreeNode *> rootset;        if(l > r)        {            rootset.push_back(NULL);            return rootset;        }                for(int i=l;i<=r;i++)        {            vector<TreeNode *> left = generate(l, i-1);            vector<TreeNode *> right = generate(i+1, r);                        for(int m=0;m<left.size();m++)                for(int n=0;n<right.size();n++)                {                    TreeNode *p = new TreeNode(i);                    p->left = left[m];                    p->right = right[n];                    rootset.push_back(p);//注意:虽然p结点是新的,但是其孩子结点对于不同的树存在共用                }        }        return rootset;    }};

0 0