不同的二叉查找树 II
题目
给出n,生成所有由1…n为节点组成的不同的二叉查找树
样例
给出n = 3,生成所有5种不同形态的二叉查找树:
题解
我们可以通过DFS解决这道题。由于二叉查找树满足父节点的值大于左子节点的值,小于右子节点的值。我们可以从root的值为i开始遍历,则它的左子树节点数为[0,i-1],右子树节点数为[i+1,n]。然后左右子树递归执行上述循环。最终可以将子树节点数减少到 1,此时一个节点只有一种排列方式,可以将结果返回给上一级,然后包含有两个节点的排列方式继续返回,直至结束,以得到所有不同结构的二叉查找树。
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @paramn n: An integer
* @return: A list of root
*/
public List<TreeNode> generateTrees(int n) {
return generate(1,n);
}
private ArrayList<TreeNode> generate(int start, int end)
{
ArrayList<TreeNode> rst = new ArrayList<TreeNode>();
if(start > end)
{
rst.add(null);
return rst;
}
for(int i=start; i<=end; i++)
{
ArrayList<TreeNode> left = generate(start, i-1);
ArrayList<TreeNode> right = generate(i+1, end);
for(TreeNode l: left)
{
for(TreeNode r: right)
{
TreeNode root = new TreeNode(i);
root.left = l;
root.right = r;
rst.add(root);
}
}
}
return rst;
}
}
Last Update 2016.10.24
生成不同形态的二叉查找树
本文介绍了一种通过深度优先搜索(DFS)生成所有可能的不同形态的二叉查找树的方法。对于给定的整数n,文章详细阐述了如何生成所有由1到n作为节点的不同二叉查找树,并提供了具体的实现代码。

被折叠的 条评论
为什么被折叠?



