Unique Binary Search Trees II

来源:互联网 发布:matalab y引入数据 编辑:程序博客网 时间:2024/05/01 06:00

Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.

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


反复做这种题,感觉自己已经会了,其实好多边界情况考虑的不清楚,这回找了半天,记录一下。

这道题要采用递归的思路,对于两个下标之间的部分建立子树。

函数为:

private List<TreeNode> generateTrees(int i, int j)

其中i, j 分别为目前可以使用的节点的左右界限,需要用这区间的值构建子树,任务是找出一个根节点,然后对根节点左右进行递归查找。

对于i j 无非两种情况:

1. i > j 

如果下标i > j 那么之间不存在任何节点,所以需要在结果集result里加上一个null,如果没有加的话,是无法构建以当前节点为根节点的子树的。这里需要注意一下。

2. i<=j, 表示i j 之间有可以利用的节点作为根节点,构建一颗子树。那么用一个嵌套循环,构建以这个点作为根节点的所有子树,然后把所有结果存入result当中,(只存根节点)。然后一层层往上层返回,这样就能把所有的情况算出来。


代码:

public List<TreeNode> generateTrees(int n) {        // write your code here        List<TreeNode> result = new ArrayList<>();        if(n<=0){            result.add(null);            return result;        }         result = generateTrees(1, n);        return result;    }    private List<TreeNode> generateTrees(int i, int j){        List<TreeNode> result = new ArrayList<>();        if(i>j){            result.add(null);            return result;        }                for(int k = i;k<=j;k++){            List<TreeNode> left = generateTrees(i, k-1);            List<TreeNode> right = generateTrees(k+1, j);            for(TreeNode l: left){                for(TreeNode r: right){                    TreeNode cur = new TreeNode(k);                    cur.left = l;                    cur.right = r;                    result.add(cur);                }            }        }        return result;    }




0 0
原创粉丝点击