给定n求二叉搜索树的个数

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

confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
private:
    vector<TreeNode *> generate(int l, int r)
    {
        vector<TreeNode *> ans;
        if (l > r)
        {
            ans.push_back(NULL);
        }
        else
        {
            for (int i=l; i<=r; i++){
                vector<TreeNode *> left = generate(l, i-1);
                vector<TreeNode *> right = generate(i+1, r);
                for (int j=0; j<left.size(); j++)
                {
                   for (int k=0; k<right.size(); k++)
                    {
                        TreeNode *pRoot = new TreeNode(i);
                        pRoot->left = left[j];
                        pRoot->right = right[k];
                        ans.push_back(pRoot);
                    }
                }

            }

        }

        return ans;
    }
public:
    vector<TreeNode *> generateTrees(int n) {
        return generate(1, n);
    }
};
时间: 2024-11-05 16:01:22

给定n求二叉搜索树的个数的相关文章

剑指Offer(Java版)第六十五题:给定一棵二叉搜索树,请找出其中的第k小的结点。 例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。

/*给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4.*//*二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值*///思路:从最左边的叶子节点开始找起. import java.util.*; public clas

二叉搜索树的个数

二叉搜索树(BST) 定义 左孩子的值全部小于根节点,右孩子的值全部大于跟结点,左孩子.右孩子同样满足上述条件. 假如有3个结点,总共有5个可能的BST: 1 3 3 2 1 \ / / / \ 3 2 1 1 3 2 / / \ 2 1 2 3 问题一:给定结点的个数,计算BST的个数 分析 令f(0) = 1 f(1) = f(0)*f(0) f(2) = f(1)*f(0) + f(0)*f(1) f(3) = f(2)*f(0) + f(1)*f(1) + f(0)*f(2) …… f(

LeetCode 96 Unique Binary Search Trees不同的二叉搜索树的个数

Given n, how many structurally unique BST's (binary search trees) that store values 1...n? 1 class Solution { 2 public: 3 int numTrees(int n) { 4 int *dp = new int[n+1]; 5 for(int i=0;i<n+1;++i) 6 dp[i] = 0; 7 8 dp[0] = 1;//!!! 9 for(int sz = 1; sz <

求二叉搜索树的前驱节点和后继节点

前驱结点:节点val值小于该节点val值并且值最大的节点 后继节点:节点val值大于该节点val值并且值最小的节点 二叉树的节点val值是按照二叉树中序遍历顺序连续设定. 前驱结点 如图4的前驱结点是3 2的前驱结点是1 6的前驱结点是5 后继节点 7的后继结点是8 5的后继节点是6 2的后继节点是3 前驱节点 若一个节点有左子树,那么该节点的前驱节点是其左子树中val值最大的节点(也就是左子树中所谓的rightMostNode) 若一个节点没有左子树,那么判断该节点和其父节点的关系 2.1 若

给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。

/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: TreeNode* KthNode(TreeNode* pRoot, int k) { //中序递归     int count = 0;              if(co

二叉搜索树&mdash;&mdash;算法导论(14)

1. 什么是二叉搜索树     顾名思义,二叉搜索树是以一棵二叉搜索树来组织的.如下图,这样的一棵树可以使用一个链表数据结构来表示,其中的每一个节点是一个对象.除了key和卫星数据之外,每个节点还包含属性left(左孩子).right(右孩子).和p(双亲)(若不存在,则值为NIL).     二叉搜索树中的关键字总是以满足二叉搜索树性质的方式存储: 设x是二叉搜索树的一个节点.如果y是x左子树中的一个节点,那么y.key≤x.key.如果y是x右子树中的一个节点,那么y.key≥x.key.

Leetcode 96. 不同的二叉搜索树

题目链接 https://leetcode.com/problems/unique-binary-search-trees/description/ 题目描述 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ 3 2 1 1 3 2 / / \ 2 1 2 3 题解 首先定义一个函数G[n]:表示1...n构成的二叉搜索树的个数.1..

二叉搜索树的第k个结点-剑指Offer

二叉搜索树的第k个结点 题目描述 给定一颗二叉搜索树,请找出其中的第k大的结点.例如,5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 思路 对于二叉搜索树,中序遍历的结果是按照顺序来的,我们设置一个变量用来计数,递归的遍历树,如果到了第k个,则把那个数取出来,我在这用的是ArrayList来存储那个结点 还可以在递归方法中直接返回结点,无需用ArrayList跟踪存储,更加简化 代码 import java.util.ArrayList; /* pub

剑指Offer对答如流系列 - 二叉搜索树的第k个结点

面试题54:二叉搜索树的第k个结点 题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点. 例如,图中的二叉搜索树,按节点值大小顺序,第三大节点的值是4. 二叉搜索树的节点定义 public class Node { int val = 0; Node left = null; Node right = null; public Node(int val) { this.val = val; } } 问题分析 二叉搜索树中序遍历的结果是顺序的.我们可以设置一个全局变量index,对二叉搜索树进