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

【题目】给定一个整数N,如果N<1,代表空树结构,否则代表中序遍历的结果为{1,2,3,…,N}.请返回可能的二叉树结构有多少。

public class NumTrees {

	public static int numTree(int n) {
		if (n < 2) {
			return 1;
		}
		int[] dp = new int[n + 1];
		dp[0] = 1;

		for (int i = 1; i <= n; i++) {
			for (int j = 1; j < i + 1; j++) {
				dp[i] += dp[j - 1] * dp[i - j];
			}
		}
		return dp[n];
	}
}

【进阶】:N的含义不变,假设可能的二叉树结构有M种,请返回M个二叉树的头结点,每一棵二叉树代表一种可能的结构。

	public static class Node {
		public int value;
		public Node left;
		public Node right;

		public Node(int value) {
			this.value = value;
		}
	}

	public static List<Node> generateTrees(int n) {
		return generate(1, n);
	}

	public static List<Node> generate(int start, int end) {
		List<Node> res = new LinkedList<>();
		if (start > end) {
			res.add(null);
		}
		Node head = null;
		for (int i = start; i < end + 1; i++) {
			head = new Node(i);
			List<Node> lsub = generate(start, i - 1);
			List<Node> rsub = generate(i + 1, end);
			for (Node l : lsub) {
				for (Node r : rsub) {
					head.left = l;
					head.right = r;
					res.add(cloneTree(head));
				}
			}

		}
		return res;
	}

	private static Node cloneTree(Node head) {
		if (head == null) {
			return null;
		}
		Node res = new Node(head.value);
		res.left = cloneTree(head.left);
		res.right = cloneTree(head.right);
		return res;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值