Unique Binary Search Trees II

来源:互联网 发布:php自动加载机制 编辑:程序博客网 时间:2024/04/30 07:18

题目

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

方法一

使用递归,DFS遍历。

    public List<TreeNode> getTrees(int start, int end) {    List<TreeNode> list = new ArrayList<TreeNode>();        if (start > end) {            list.add(null);            return list;        }                for (int i = start; i <= end; i++) {            List<TreeNode> left = getTrees(start, i - 1);            List<TreeNode> right = getTrees(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);                    list.add(root);                }            }        }        return list;    }public List<TreeNode> generateTrees(int n) {    return getTrees(1, n);}

方法二

将递归转换为迭代,思想和方法一类似。
//    public TreeNode clone(TreeNode root, int j) {//if (root == null) {//return null;//}//TreeNode node = new TreeNode(root.val + j);//node.left = clone(root.left, j);//node.right = clone(root.right, j);//return node;//}////public List<TreeNode> generateTrees(int n) {//    List<List<TreeNode>> list = new ArrayList<List<TreeNode>>();//    List<TreeNode> zero = new ArrayList<TreeNode>();//    TreeNode zeroNode = null;//    zero.add(zeroNode);//    List<TreeNode> one = new ArrayList<TreeNode>();//    TreeNode oneNode = new TreeNode(1);//    one.add(oneNode);//    List<TreeNode> two = new ArrayList<TreeNode>();//    TreeNode twoNodeFirst = new TreeNode(1);//    twoNodeFirst.right = new TreeNode(2);//    TreeNode twoNodeSecond = new TreeNode(2);//    twoNodeSecond.left = new TreeNode(1);//    two.add(twoNodeFirst);//    two.add(twoNodeSecond);//    list.add(zero);//    list.add(one);//    list.add(two);//    if (n <= 2) {//        return list.get(n);//    }//    for (int i = 3; i <= n; i++) {//        List<TreeNode> cur = new ArrayList<TreeNode>();//        int len = i;//        for (int j = 1; j <= len; j++) {//            List<TreeNode> left = list.get(j - 1);//            int leftSize =  left.size();//            List<TreeNode>  right = list.get(len - j);//            int rightSize =  right.size();//            for (int p = 0; p < leftSize; p++) {////                for (int q = 0; q < rightSize; q++) {//                    TreeNode root = new TreeNode(j);//                    //                    TreeNode leftNode = left.get(p);//                    TreeNode rightNode = right.get(q);//                    if (rightNode == null) {//                        root.right = rightNode;//                    } else {//                        TreeNode newRightNode = clone(rightNode, j);//                        root.right = newRightNode;//                    }//                    root.left = leftNode;//                    cur.add(root);//                }//            }//        }//        list.add(cur);//    }//    return list.get(n);//}




0 0
原创粉丝点击