Unique Binary Search Trees II 构造出所有的二分搜索树

如果对Unique Binary Search Trees 不熟悉的,请先看我之前的post.


在这里,我们不仅要计算出不同的二分树的个数,还需要构造出所有符合要求的二分树。

回忆之前的迭代细节:

count(n) = count (0) + count(n - 1 - 0) + .. + count(i) + count(n - 1 - i) + .. + count(n - 1) * count(0)

在这里就转变成了:

要构造一个节点数为n 的树: 等于先构造它 子树 subTree(1, i - 1 ) 和 subTree(i + 1, n), 这个子树的root = node( i )


代码:

    public List<TreeNode> generateTrees(int n) {
        if (n <= 0) {
            return new ArrayList<>();
        }
        return doGenerateTrees(1, n);
    }

    private List<TreeNode> doGenerateTrees(int begin, int end) {
        List<TreeNode> store = new ArrayList<>();
        if (begin > end) {
            store.add(null);// attention: must add null
            return store;
        }
        for (int i = begin; i <= end; i++) {
            List<TreeNode> leftList = doGenerateTrees(begin, i - 1);
            List<TreeNode> rightLIst = doGenerateTrees(i + 1, end);
            for (TreeNode leftNode : leftList) {
                for (TreeNode rightNode : rightLIst) {
                    TreeNode head = new TreeNode(i);
                    head.left = leftNode;
                    head.right = rightNode;
                    store.add(head);
                }
            }
        }
        return store;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值