LeetCode 095 Unique Binary Search Trees II

来源:互联网 发布:响当当 小贷软件 编辑:程序博客网 时间:2024/06/07 05:34

题目


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;    }}



0 0
原创粉丝点击