您的位置:首页 > 产品设计 > UI/UE

LeetCode 095 Unique Binary Search Trees II

2014-03-03 13:19 375 查看
题目

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

对于给定n,生成所有可能的二叉查找树。

思路

1 和前一篇对应,要知道二叉查找树的定义。

2 只求数量的时候,从底层记录开始的dp算法可以完成。

  但是需要所有可能的形式的时候,要把每次生成都给列出,这时候一般使用从顶而下的dfs算法。

3 当使用这种dfs的时候,函数返回的内容很关键。可以看到返回的是ArrayList<TreeNode> ,代表是什么?一组树的节点。也就是满足特定要求的树的节点。

4 然后考虑递归形式。考虑到任何一点i作为root,用这个函数,可以生成一组可能的左节点,也可以生成一组可能的右节点。左节点的要求是start--i-1,右节点的要求是i+1--end。这样一来,再把每组都给链接到root上面,把这个root入arraylist即可。可以看到下层也是这么处理的。

代码

public class Solution {
public ArrayList<TreeNode> generateTrees(int n) {
return useme(1,n);
}
public ArrayList<TreeNode> useme(int start,int end){
ArrayList<TreeNode> ans = new ArrayList<TreeNode>();
if(start>end){
ans.add(null);
return ans;
}
for(int i=start;i<=end;i++){
ArrayList<TreeNode> left = useme(start,i-1);
ArrayList<TreeNode> right = useme(i+1,end);
for(int j = 0 ;j<left.size();j++){
for(int k=0;k<right.size();k++){
TreeNode root = new TreeNode(i);
root.left = left.get(j);
root.right = right.get(k);
ans.add(root);
}
}

}
return ans;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 面试笔试