当前位置: 首页 > 后端技术 > Java

LeetCode-096-DifferentBinarySearchTrees

时间:2023-04-02 09:16:16 Java

DifferentBinarySearchTrees题目描述:给定一个整数n,求一棵正好由n个节点组成的二叉搜索树,节点值从1到n不等,共有多少种?返回满足题意的二叉搜索树的数量。二叉搜索树(BinarySearchTree):也称为二叉排序树,它要么是一棵空树,要么是一棵二叉树,具有以下性质:如果它的左子树不为空,则左子树上所有节点的值节点小于其根节点的值;如果它的右子树不为空,则右子树上所有节点的值都大于它的根节点的值;它的左右子树也是一棵有序的二叉树。例子见LeetCode官网。来源:LeetCode链接:https://leetcode-cn.com/probl...版权归LeetCode所有。商业转载请联系官方授权,非商业转载请注明出处。方案一:递归的方法首先,当n为0时,结果是一棵空树,直接返回一个空列表。当n大于0时,用递归的方法分别得到左右子树。递归过程如下:所有节点都可以作为根节点,即遍历1到n的所有值作为根节点,当前根节点为i;然后i左边的所有值作为i的左子树递归调用方法;i右边的所有值递归调用方法作为i的右子树;最后把根节点i和对应的左右子树拼成一棵树,放到结果集中。最后,返回结果集的size值为符合条件的二叉查找树的数量。说明:该方法参考了LeetCode-095-DifferentBinarySearchTreeII,提交时超时。解法一:求法表明,当整数为n时,二分查找数的结果为前面所有可能结果之和。importcom.kaesar.leetcode.TreeNode;importjava.util.ArrayList;importjava.util.List;publicclassLeetCode_096{/***递归:方法运行时超时**@paramn*@return*/publicstaticintnumTrees(intn){//当n为0时,它是一棵空树if(n==0){return1;}返回generateTrees(1,n).size();}privatestaticListgenerateTrees(intstart,intend){ListallTrees=newArrayList<>();如果(开始>结束){allTrees.add(空);返回所有树;}for(inti=start;i<=end;i++){//所有可能的左子树集合ListleftTrees=generateTrees(start,i-1);//所有可能的右子树集合ListrightTrees=generateTrees(i+1,end);for(TreeNodeleftTree:leftTrees){for(TreeNoderightTree:rightTrees){TreeNoderoot=n新建树节点(i);root.left=左树;root.right=右树;allTrees.add(根);}}}返回allTrees;}publicstaticintnumTrees2(intn){int[]result=newint[n+1];结果[0]=1;结果[1]=1;for(inti=2;i<=n;i++){for(intj=1;j<=i;j++){结果[i]+=结果[j-1]*结果[i-j];}}返回结果[n];}publicstaticvoidmain(String[]args){System.out.println(numTrees(3));System.out.println(numTrees2(3));}}【每日留言】青春是本钱,但不努力一文不值