95. Unique Binary Search Trees II

一、题目

  1、审题

  2、分析

    给出数值 n, 输出由节点值为 1,2....n  所形成的所有二叉查找树。

二、解答

  1、思路:

    采用递归实现。

    ①、分别假设父结点为 1,2...i...n ,则左孩子为 1,2,..i-1, 右孩子为 i+1,i+2...n。

    ②、用列表 left 存储 左孩子的所有可能二叉树,用列表 right 存储右孩子的所有可能二叉树。最总将 left 拼接为 i 的左孩子,right 拼接为 i 的右孩子。

    ③、递归跳出条件为最左节点值 start > 最右节点值 end.

  

private List<TreeNode> genTrees(int start, int end) {
        
        List<TreeNode> list = new ArrayList<>();
        
        if(start > end) {
            list.add(null);
            return list;
        }
        
        List<TreeNode> left, right;
        
        for (int i = start; i <= end; i++) {
            
            left = genTrees(start, i -1); // 左子树的所有结构
            right = genTrees(i + 1, end);    // 右子树的所有结构
            
            for(TreeNode lnode: left) {
                for(TreeNode rnode: right) {
                    TreeNode root = new TreeNode(i);    // 左右子树与头结点拼接
                    root.left = lnode;
                    root.right = rnode;
                    list.add(root);
                }
            }
        }
        return list;
    }
原文地址:https://www.cnblogs.com/skillking/p/9709016.html