• Leetcode 96. 不同的二叉搜索树(简单) 95. 不同的二叉搜索树II(中等)


    思路:labuladong

    96. 不同的二叉搜索树(简单)

    题目:给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

    示例 1:
    * 输入:n = 3
    * 输出:5
     
    * 示例 2:
    * 输入:n = 1
    * 输出:1
     
    思路:
    可以使用递归的思想,选定i为根节点后,可能性就是count(low,i-1)*count(i+1,high)。那么遍历1-n,累加所有可能性即可
    这里遍历时,会存在重复递归的问题,因此可以使用mem[n+1][n+1]记录count值
     
    class Solution {
    public:
        int numTrees(int n) {
            mem=vector<vector<int>>(n+1,vector<int>(n+1,0));
            return count(1,n);
        }
        int count(int lo, int hi){
            if(lo>hi) return 1;
            if(mem[lo][hi]!=0) return mem[lo][hi];
            int ret=0;
            for(int i=lo;i<=hi;++i){
                int left=count(lo,i-1);
                int right=count(i+1,hi);
                ret+=left*right;        
            }
            mem[lo][hi]=ret;
            return ret;
        }
        vector<vector<int>> mem;
    };

    95. 不同的二叉搜索树II(中等)

    题目:

    给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
    示例 1:
    * 输入:n = 3
    * 输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
     
    * 示例 2:
    * 输入:n = 1
    * 输出:[[1]]
     
    思路:
    递归遍历所有可能性,当lo>hi时,只有null一种可能性,build(lo,hi)就返回了所有可能构建的根节点数组
    所以遍历i=lo;i<=hi,然后得到build(lo,i-1)与build(i+1,hi)的数组后,遍历组合即可。
     
    class Solution {
    public:
        vector<TreeNode*> generateTrees(int n) {
            if(n==0) return vector<TreeNode*>();
            return build(1,n);
        }
        vector<TreeNode*> build(int lo,int hi){
            vector<TreeNode*> ret;
            if(lo>hi){
                ret.push_back(nullptr);
                return ret;
            } 
            for(int i=lo;i<=hi;++i){
                vector<TreeNode*> left=build(lo,i-1);
                vector<TreeNode*> right=build(i+1,hi);
                for(int j=0;j<left.size();++j){
                    for(int k=0;k<right.size();++k){
                        TreeNode* root=new TreeNode(i);
                        root->left=left[j];
                        root->right=right[k];
                        ret.push_back(root);
                    }
                }
            }
            return ret;
        }
    };
  • 相关阅读:
    Java实现第九届蓝桥杯付账问题
    Java实现第九届蓝桥杯付账问题
    Java实现第九届蓝桥杯星期一
    Java实现第九届蓝桥杯星期一
    Java实现第九届蓝桥杯倍数问题
    Java实现第九届蓝桥杯倍数问题
    Java实现第九届蓝桥杯倍数问题
    Java实现第九届蓝桥杯倍数问题
    Java实现第九届蓝桥杯倍数问题
    Java实现第九届蓝桥杯三体攻击
  • 原文地址:https://www.cnblogs.com/zl1991/p/15879838.html
Copyright © 2020-2023  润新知