LintCode-不同的二叉查找树

给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种?

样例

给出n = 3,有5种不同形态的二叉查找树:

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

分析:只要记录下有x个不同的数的情况下有多少种解法,不适合用递归,在数据量较大的情况下,于是可以用记忆化搜索。我这里直接用一个数组保存结果了= =

代码:

class Solution {
public:
    /**
     * @paramn n: An integer
     * @return: An integer
     */
    int numTrees(int n) {
        // write your code here
        int * dp = new int[n+1];
        fill(dp,dp+n+1,0);
        dp[0]=dp[1]=1;
        for(int i=2;i<=n;i++)
        {
            for(int j=1;j<=i;j++)
                dp[i]+= dp[j-1]*dp[i-j];
        }
        int ret = dp[n];
        delete[] dp;
        return ret;

    }
};
时间: 2024-08-27 23:31:53

LintCode-不同的二叉查找树的相关文章

LintCode 85. 在二叉查找树中插入节点

题目: 给定一棵二叉查找树和一个新的树节点,将节点插入到树中. 你需要保证该树仍然是一棵二叉查找树 样例 给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样的: 2 2 / \ / 1 4 --> 1 4 / / \ 3 3 6 挑战 能否不使用递归? /** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val)

LintCode 11 二叉查找树的搜索区间

题目链接:http://www.lintcode.com/zh-cn/problem/search-range-in-binary-search-tree/ 1.描述 给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点.找到树中所有值在 k1 到 k2 范围内的节点.即打印所有x (k1 <= x <= k2) 其中 x 是二叉查找树的中的节点值.返回所有升序的节点值. 2.样例 3.思路分析 要充分利用二叉查找树的特性:左小右大和中序遍历就是一个有序序列. 借助一个栈

lintcode 中等题:unique Binary Search Tree 不同的二叉查找树

题目 不同的二叉查找树 给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种? 样例 给出n = 3,有5种不同形态的二叉查找树: 1 3 3 2 1 \ / / / \ 3 2 1 1 3 2 / / \ 2 1 2 3 解题 public class Solution { /** * @paramn n: An integer * @return: An integer */ public int numTrees(int n) { // write your code here

lintcode 容易题:Insert Node in a Binary Search Tree 在二叉查找树中插入节点

题目:  在二叉查找树中插入节点 给定一棵二叉查找树和一个新的树节点,将节点插入到树中. 你需要保证该树仍然是一棵二叉查找树.  样例 给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样的: 挑战 能否不使用递归? 解题: 递归的方法比较简单 Java程序: /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public

LintCode刷题——不同的二叉查找树I、II

不同的二叉查找树I: 题目内容: 给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种? 样例: 给出n = 3,有5种不同形态的二叉查找树: 1 3 3 2 1 \ / / / \ 3 2 1 1 3 2 / / \ 2 1 2 3 算法分析: 先来看一下二叉查找树的特点,当选定一个节点i作为中间节点时: ①位于该节点左子树中的所有节点均小于i,假设该节点的左子树的排列情况有m种: ②位于该节点右子树中的所有节点均大于i,假设该节点的右子树的排列情况有n种: ③综合①和②,当节点i

验证二叉查找树(LintCode)

验证二叉查找树 给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值. 左右子树也必须是二叉查找树. 样例 一个例子: 2 / 1 4 / 3 5 上述这棵二叉树序列化为 {2,1,4,#,#,3,5}. 中序遍历得到中序遍历序列,验证是否递增即可. 1 /** 2 * Definition of TreeNode: 3 * public class TreeNode { 4 * public

LintCode(85)在二叉查找树中插入节点

题目 在二叉查找树中插入节点 给定一棵二叉查找树和一个新的树节点,将节点插入到树中. 你需要保证该树仍然是一棵二叉查找树. 样例 给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样的: 2 2 / \ / 1 4 --> 1 4 / / \ 3 3 6 分析 递归和非递归两种方法实现. Python代码 """ Definition of TreeNode: class TreeNode: def __init__(self, val): self.val

lintcode 11. 二叉查找树中搜索区间

class Solution { public: vector<int> res; int k11,k22; static bool comp(const int &a,const int &b) { return a<b; } /* * @param root: param root: The root of the binary search tree * @param k1: An integer * @param k2: An integer * @return:

验证二叉查找树

二叉查找树 给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值. 左右子树也必须是二叉查找树. 因为二叉查找树的中序遍历是有序的.所以验证是否为二叉查找树,用中序遍历这个二叉树,如果前一个结点的值大于当前结点的值,则证明这个不是二叉树. 代码实现 bool isValidBST(TreeNode *root) { // write your code here if(root == NULL

85 在二叉查找树中插入节点

原题网址:http://www.lintcode.com/zh-cn/problem/insert-node-in-a-binary-search-tree/ 给定一棵二叉查找树和一个新的树节点,将节点插入到树中. 你需要保证该树仍然是一棵二叉查找树. 注意事项 You can assume there is no duplicate values in this tree + node. 您在真实的面试中是否遇到过这个题? Yes 样例 给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可