164.Unique Binary Search Trees II-不同的二叉查找树 II(中等题)

生成不同形态的二叉查找树
本文介绍了一种通过深度优先搜索(DFS)生成所有可能的不同形态的二叉查找树的方法。对于给定的整数n,文章详细阐述了如何生成所有由1到n作为节点的不同二叉查找树,并提供了具体的实现代码。

不同的二叉查找树 II

  1. 题目

    给出n,生成所有由1…n为节点组成的不同的二叉查找树

  2. 样例

    给出n = 3,生成所有5种不同形态的二叉查找树:
    这里写图片描述

  3. 题解

    我们可以通过DFS解决这道题。由于二叉查找树满足父节点的值大于左子节点的值,小于右子节点的值。我们可以从root的值为i开始遍历,则它的左子树节点数为[0,i-1],右子树节点数为[i+1,n]。然后左右子树递归执行上述循环。最终可以将子树节点数减少到 1,此时一个节点只有一种排列方式,可以将结果返回给上一级,然后包含有两个节点的排列方式继续返回,直至结束,以得到所有不同结构的二叉查找树。

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */
public class Solution {
    /**
     * @paramn n: An integer
     * @return: A list of root
     */
    public List<TreeNode> generateTrees(int n) {
        return generate(1,n);
    }

    private ArrayList<TreeNode> generate(int start, int end)
    {
        ArrayList<TreeNode> rst = new ArrayList<TreeNode>();   

        if(start > end)
        {
            rst.add(null);
            return rst;
        }

        for(int i=start; i<=end; i++)
        {
            ArrayList<TreeNode> left = generate(start, i-1);
            ArrayList<TreeNode> right = generate(i+1, end);
            for(TreeNode l: left)
            {
                for(TreeNode r: right)
                {
                    TreeNode root = new TreeNode(i);  
                    root.left = l;
                    root.right = r;
                    rst.add(root);
                }
            }
        }
        return rst;
    }
}

Last Update 2016.10.24

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值