不同的二叉搜索树 II

不同的二叉搜索树 II


今天做了下leetcode的题,又是喜闻乐见想不出思路,看了解答就豁然开朗。
leetcode题目链接

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

不同的二叉搜索树 II
解题思路就是,根据二叉树的特性,如果一个数比当前节点小,那么就将数放到当前数的左节点,如果数比当前数大就放到当前节点的右节点。
而1 … n 为节点组成一个二叉搜索树。
那么当当前节点为i的时候,存在[1,i-1]个左子树,[i+1,n]个右子树。
根据上面的思路我们只需要得到从1到n为根节点的树就行了。
在以I为跟节点的时候,获取[1,i-1]的左子树,[i+1,n]的右子树就行。

public class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode(int x) { val = x; }
}

public static List<TreeNode> generateTrees(int n) {
        if(n == 0){
            return null;
        }
        return getTree(1,n);
    }

    public static List<TreeNode> getTree(int start, int end){
        List<TreeNode> treeNodes = new ArrayList<TreeNode>();
        if(start>end){
            treeNodes.add(null);
            return treeNodes;
        }
        for (int i =start ;i<=end;i++){
            //以i当根节点
            //获取左子数
            List<TreeNode> leftTreeNode = getTree(start,i-1);
            //获取右子数
            List<TreeNode> rightTreeNode = getTree(i+1,end);
            for (TreeNode leftNode : leftTreeNode) {
               for (TreeNode rightNode : rightTreeNode){
                   //在这里创建新树节点,确保每次往list添加的时候都是一颗新树对象
                   TreeNode treeNode = new TreeNode(i);
                   treeNode.left = leftNode;
                   treeNode.right = rightNode;
                   treeNodes.add(treeNode);
               }
            }
        }
        return treeNodes;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值