不同的二叉搜索树

给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。

示例:

输入: 3
输出:
[
  [1,null,3,2],
  [3,2,null,1],
  [3,1,null,null,2],
  [2,1,3],
  [1,null,2,null,3]
]
解释:
以上的输出对应以下 5 种不同结构的二叉搜索树:

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

 

 

解题思路:

该题求解由1-n构成的所有二叉搜索树,若以 i(1<=i<=n)为根节点,i的左子树的节点应当小于i,右子树的节点大于i。

则(1, i-1)构成的所有二叉搜索树,节点i,(i+1, n)构成的所有二叉搜索树,可以得到以i为根节点的所有BST。

故要得到以i为根节点的BST,要先得到(1, i-1)构成的所有二叉搜索树与(i+1, n)构成的所有二叉搜索树。可以采用递归法求解此题。

 

代码如下:

    public static List<TreeNode> generateTrees(int n) {
        if (n ==0) return new LinkedList<TreeNode>();
        List<TreeNode> list = test(1, n);
        return list;
    }

    private static List<TreeNode> test(int m, int n) {

        List<TreeNode> list = new LinkedList<TreeNode>();
        if (m>n) {
            list.add(null);
            return list;
        }
        if (m == n) {
            list.add(new TreeNode(m));
            return list;
        }

        List<TreeNode> left;    // (m,i-1)构成的所有BST 
        List<TreeNode> right;   // (i+1,n)构成的所有BST
        TreeNode root;
        for (int i=m; i<=n; i++) {
            left = test(m, i-1);
            right = test(i+1, n);

            // 以节点i为根节点的所有二叉搜索树
            for (TreeNode leftNode:left)
                for (TreeNode rightNode:right) {
                    root = new TreeNode(i);
                    root.left = leftNode;
                    root.right = rightNode;
                    list.add(root);
                }
        }
        return list;
    }

 

 

posted on 2018-06-06 20:42  Deltadeblog  阅读(146)  评论(0编辑  收藏  举报

导航