Unique Binary Search Trees II

统计和生成所有不同的二叉树

给定一个整数N,中序遍历结果为{1,2,3…N},返回可能的二叉树结构有多少

方法

num[a]表示a个节点的搜索二叉树有多少种可能,如果以i作为头结点,i的左子树有i-1个节点,有num[i-1]种,右子树有N-i个节点,所以有num(N-i)种,所以以i为头节点的可能性为num(i-1)*num(N-i)

public int numTrees(int n){
        if(n < 2){
            return 1;
        }
        //第n个有多少种
        int[] num = new int[n+1];
        num[0] = 1;
        for(int i = 1; i < n + 1; i++){
            for(int j = 1; j < i + 1; j++){
                num[i] += num[j-1]*num[i-j];
            }
        }
        return num[n];
    }

给定一个整数N,中序遍历结果为{1,2,3…N},返回可能的二叉树

方法

对于以i节点为头结点的节点,用{a…i-1}递归生成左子树的所有结构,所有结构的头节点保存在left.{i+1…end}递归生成右子树的所有结构,所有结构的头结点保存在right. left的每一种结构都可以与right结构一起构成单独的结构。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<TreeNode> generateTrees(int n) {
        if(n == 0){
            return new LinkedList<TreeNode>();
        }
        return generate(1,n);
    }
    public List<TreeNode> generate(int start, int end){
        List<TreeNode> res = new LinkedList<TreeNode>();
        if(start > end){
            res.add(null);
            return res;
        }
        for(int i = start; i <= end; i++){
            List<TreeNode> left = generate(start, i-1);
            List<TreeNode> right = generate(i+1, end);
            for(TreeNode tLeft : left){
                for(TreeNode tRight : right){
                    TreeNode root = new TreeNode(i);
                    root.left = tLeft;
                    root.right = tRight;
                    res.add(root);
                }
            }
        }
        return res;
    }
}
Share