leetcode 95. 不同的二叉搜索树 II

北城以北 提交于 2019-11-29 23:18:56

给定一个整数 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

这个题不会做,不知道保存的格式是啥。。。于是上网找了一下,把代码注释了一下,基本差不多了

这个答案是这样的,比如:[3,1,null,null,2] 想要表达的是,根节点是3,左子树是1,右子树是null,左子树是1为根的时候,1的左子树是null,右子树是2.

代码如下:

/**
 * 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) {
        vector<TreeNode*> t;
        if(n==0) return t;
        return f(1, n);
    }
    vector<TreeNode*> f(int l, int r){
        //表示,遍历从l到r所有节点作为根节点时的所有情况
        vector<TreeNode*>ans;
        if(l==r){
            //只有这一个节点,这个节点左右子树都是空
            TreeNode *root = new TreeNode(l);
            ans.push_back(root);
        }
        else if(l>r){
            //空节点,返回空的指针
            ans.push_back(NULL);
        }
        else{
            //如果l<r,说明,有左子树或者右子树
            for (int i = l; i <= r; ++i) {
                //遍历所有从l到r的节点,让他们依次做根节点
                vector<TreeNode*> left_tree = f(l, i-1);
                vector<TreeNode*> right_tree = f(i+1, r);
                for (int a = 0; a < left_tree.size(); ++a) {
                    for (int b = 0; b < right_tree.size(); ++b) {
                        TreeNode *root = new TreeNode(i);
                        root->left = left_tree[a];
                        root->right = right_tree[b];
                        ans.push_back(root);
                    }
                }
            }
        }
        // 这里返回的是根节点的指针的vector
        // 这个返回值代表的意思是,这个ans里面存了所有当前树的根节点指针,
        // 就是,如果l=2,r=4,里面就保存了根节点为:2,3,4时候,所有子树的情况,
        // 而且,当根节点为3的时候,左右子树的根可以分别为[1,2]和[4],那么,需要组合所有情况,
        // 就是,当根节点为3时,左右子树的根节点分别为[1,4]或者[2,4]
        // 通过这个根节点指针,可以找到相应的左子树和右子树,
        return ans;
    }
};
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!