leetcode Unique Binary Search Trees II

来源:互联网 发布:淘宝网电脑版登录 编辑:程序博客网 时间:2024/06/06 07:52

Unique Binary Search Trees II 原题地址:

https://oj.leetcode.com/problems/unique-binary-search-trees-ii/

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

求所有的可能。

网上有一种作法是递归,对每个可能的根,求左子树所有的可能性,再求右子树所有可能性,两个for循环列举出来,作为根下所有的可能。

public class Solution {    public List<TreeNode> generateTrees(int lo, int hi) {List<TreeNode> tnlist = new ArrayList<TreeNode>();if (hi < lo) {tnlist.add(null);return tnlist;}List<TreeNode> left = new ArrayList<TreeNode>();List<TreeNode> right = new ArrayList<TreeNode>();for (int i = lo; i <= hi; i++) {left = generateTrees(lo, i-1);right = generateTrees(i+1, hi);for (int p = 0; p < left.size(); p++)for (int q = 0; q < right.size(); q++) {TreeNode tn = new TreeNode(i);tn.left = left.get(p);tn.right = right.get(q);tnlist.add(tn);}}return tnlist;}public List<TreeNode> generateTrees(int n) {return generateTrees(1, n);}}

以下为另一种代码:

public class Solution {    TreeNode copy(TreeNode node) {      TreeNode tn = new TreeNode(node.val);      if (node.left == null) tn.left = null;      elsetn.left = copy(node.left);      if (node.right == null)tn.right = null;      elsetn.right = copy(node.right);      return tn;      }            TreeNode copy(TreeNode node, int plus) {      TreeNode tn = new TreeNode(node.val+plus);      if (node.left == null) tn.left = null;      elsetn.left = copy(node.left, plus);      if (node.right == null)tn.right = null;      elsetn.right = copy(node.right, plus);      return tn;      }      public List<TreeNode> generateTrees(int n) {        int[] num = new int[n+1];        num[0] = 1;        HashMap<Integer, List<TreeNode>> map = new HashMap<Integer, List<TreeNode>>();        for (int i = 0; i <= n; i++)        map.put(i, new ArrayList<TreeNode>());        map.get(0).add(null);        if (n == 0)        return map.get(0);        map.get(1).add(new TreeNode(1));        for (int i = 2; i <= n; i++)        for (int j = 1; j <= i; j++) {        int left = j - 1;        int right = i - j;                int l_num = map.get(left).size();        int r_num = map.get(right).size();                for (int p = 0; p < l_num; p++)        for (int q = 0; q < r_num; q++){        TreeNode tn = new TreeNode(j);        if (map.get(left).get(p) == null)        tn.left = null;        else        tn.left = copy(map.get(left).get(p));        if (map.get(right).get(q) == null)        tn.right = null;        else        tn.right = copy(map.get(right).get(q), j);        map.get(i).add(tn);        }        }        return map.get(n);    }}





0 0
原创粉丝点击