第55题 Unique Binary Search Trees II

来源:互联网 发布:暴漫淘宝 编辑:程序博客网 时间:2024/06/15 13:19

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

confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.


OJ's Binary Tree Serialization:

The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.

Here's an example:

   1  / \ 2   3    /   4    \     5
The above binary tree is serialized as "{1,2,3,#,#,4,#,#,5}".

Hide Tags
 Tree Dynamic Programming
Solution in Java:
/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public List<TreeNode> generateTrees(int n) {       return  generate(1, n);    }    public List<TreeNode> generate(int start, int end){        List<TreeNode> results = new ArrayList<TreeNode>();        if(start>end){            results.add(null);            return results;        }        for(int indexRoot = start; indexRoot<=end; indexRoot++){            List<TreeNode> leftSubtrees = generate(start, indexRoot-1);            List<TreeNode> rightSubtrees = generate(indexRoot+1, end);            for(int leftRoot=0; leftRoot<leftSubtrees.size(); leftRoot++){                for(int rightRoot=0; rightRoot<rightSubtrees.size(); rightRoot++){                    TreeNode curRoot = new TreeNode(indexRoot);                    curRoot.left = leftSubtrees.get(leftRoot);                    curRoot.right = rightSubtrees.get(rightRoot);                    results.add(curRoot);                }            }        }        return results;    }}

Note: 从1到n生成BST,先选定1到n之间的一个数indexRoot作为根节点。则从1到indexRoot-1为左子树,从indexRoot+1到n为右子树。
递归求得左子树和右子树根结点的list后,遍历两个list,将其中的TreeNode作为该root的左孩子和又孩子。



0 0
原创粉丝点击