转载

[LeetCode] 95. Unique Binary Search Trees II 不同的二叉搜索树 II leetcode java

题目:

给定一个整数 n ,生成所有由 1 …  n 为节点所组成的 二叉搜索树

示例:

<strong>输入:</strong> 3
<strong>输出:</strong>
[
  [1,null,3,2],
  [3,2,null,1],
  [3,1,null,null,2],
  [2,1,3],
  [1,null,2,null,3]
]
<strong>解释:</strong>
以上的输出对应以下 5 种不同结构的二叉搜索树:

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

思路:

当前的递归中,假设root为i。那么显然左子树是由[1,i-1]构成的所有可能的组合,显然右子树是由[i+1,n]构成的所有可能的组合(可以统一记录为,用[start, end]去构建树)。在有了左子树,root,右子树的情况下,根据乘法原理很容易计算得出在当前情况下的所有的树。记录root到一个vector中就可以完整地记录所有结果。返回结果即可。

那么,怎么计算左子树或者右子树的所有可能,这是个和上面类似的问题。

临界条件是,

当[start,end]中star==end时,说明只有一个节点。于是返回这个节点。

当[start,end]中star<end时,返回NULL。

代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<TreeNode> generateTrees(int n) {
		if (n <= 0)
			return new ArrayList<TreeNode>();
		return generateSubTree(1, n);
	}

	public ArrayList<TreeNode> generateSubTree(int start, int end) {
		ArrayList<TreeNode> result = new ArrayList<TreeNode>();
		if (start > end) {
			result.add(null);
			return result;
		}
		for (int rootVal = start; rootVal <= end; rootVal++)
			for (TreeNode leftSubTreeRoot : generateSubTree(start, rootVal - 1))
				for (TreeNode rightSubTreeRoot : generateSubTree(rootVal + 1, end)) {
					TreeNode root = new TreeNode(rootVal);
					root.left = leftSubTreeRoot;
					root.right = rightSubTreeRoot;
					result.add(root);
				}
		return result;
	}
}
原文  http://www.lisite.top/2018/07/14/leetcode-95-unique-binary-search-trees-ii-不同的二叉搜索树-ii-leetcode-java/547.html
正文到此结束
Loading...