首页 > 其他分享 >LC 96.不同的二叉搜索树

LC 96.不同的二叉搜索树

时间:2024-04-05 13:30:49浏览次数:27  
标签:LC int 不同 二叉 搜索 节点 dp 96

96.不同的二叉搜索树

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例 1:

**输入:**n = 3
**输出:**5

示例 2:

**输入:**n = 1
**输出:**1

提示:

  • 1 ≤ n ≤ 19 1 \leq n \leq 19 1≤n≤19

解法一(动态规划)

思路分析:

  1. 对于求不同的二叉搜索树问题,可以发现,当n = 4时,二叉搜索树一共有4个节点,那么,这四个节点可以轮流为根节点,并在左右子树分别进行二叉搜索树。即左子树可能有0个,1个,2个,3个节点,而右子树也有0个,1个,2个,3个节点。
  2. 如此,对于n = 4时,求不同二叉搜索树的问题,进一步分化为,求3个节点的不同二叉搜索树,2个节点的不同二叉搜索树,1个节点的不同二叉搜索树,0个节点的不同二叉搜索树。
  3. 根据上面的分析,问题分解为多个子问题,考虑使用动态规划算法;即动规五步曲:
    1. 定义状态:即dp[i]表示,由i个节点可以组成dp[i]个不同的二叉搜索树
    2. 确定状态转移方程:即dp[i] = dp[0] * dp[i-1] + dp[1] * dp[i-2] + ... + dp[i-1] * dp[0];进一步可以表示为:dp[i] = dp[j] * dp[i-j-1],其中j在区间[0, i)
    3. 确定初始状态:即dp[0] = 1; dp[1] = 1,因为由0或1个节点都只可以组成1个不同的二叉搜索树
    4. 确定dp遍历顺序:即从i = 2开始往后遍历,因为dp[0]dp[1]已经确定;同时得到dp[i]的状态需要依赖i之前的状态
    5. 打印dp数组,检验是否符合思路和题意

实现代码如下:

class Solution {
    public int numTrees(int n) {
		// dp[i]的含义:由i个连续整数节点可以组成dp[i]种不同的二叉搜索树
		int[] dp = new int[n+1];	// 状态转移方程为:dp[i] += dp[j] * dp[i-j-1]
		// 初始化dp
		dp[0] = 1;	// 空树 也算是一种组成的二叉搜索树
		dp[1] = 1;
		for (int i = 2; i <= n; ++ i) {
			for (int j = 0; j < i; ++ j) {
				dp[i] += dp[j] * dp[i-j-1];
			}
		}
		return dp[n];
    }
}

提交结果如下:

解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:39.2 MB,击败了91.72% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( n ) O(n) O(n)

标签:LC,int,不同,二叉,搜索,节点,dp,96
From: https://blog.csdn.net/qq_61457746/article/details/137398786

相关文章

  • 被吹上天的软PLC,究竟是个什么东西
    最近有一个比较火的概念:软PLC(SoftPLC),可谓在工业领域被吹爆了,那么,究竟什么是软PLC呢?其实在1996年,软PLC这个概念就被引入中国,二十年来,也是发展的非常迅速。软PLC是一种软件实现的可编程逻辑控制器,它与硬件PLC在功能上相似,但运行平台更为灵活,可以运行在通用处理器或计算机上......
  • 删除二叉搜索树中的节点(力扣450)
    文章目录题目前知二叉搜索树是什么?题解一、思路二、解题方法三、Code总结题目Problem:450.删除二叉搜索树中的节点给定一个二叉搜索树的根节点root和一个值key,删除二叉搜索树中的key对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新......
  • 【漏洞复现】宏景人力资源信息管理系统 DisplayExcelCustomReport 任意文件读取漏洞
    免责声明:文章来源互联网收集整理,文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者......
  • 栈的应用之二叉树的中序遍历
    中序遍历一、实例要求给定一个二叉树的根节点root,返回它的中序遍历;二、实例分析1、首先定义了二叉树的结构TreeNode,以及栈的结构Stack和相关操作;2、然后实现了中序遍历函数inorderTraversal,在遍历过程中使用栈来辅助实现;3、最后释放了内存;三、示例代码/**......
  • P5960 【模板】差分约束
    原题链接题解我一直苦苦思考为什么要建边,现在我明白了,如果令\(x_i\)代表离源点的最短路径长度的话,建边之后,\(x_i-x_j<=y_k\)一定成立只有当出现负环的时候说明条件出现了矛盾太神了code#include<bits/stdc++.h>usingnamespacestd;queue<int>q;intin_q[5005]={0};......
  • CF1896H2
    看不懂的题首先考虑\([a_i\neqb_i]=-2a_ib_i+a_i+b_i\),所以:\[f(a,b)=\suma_i+\sumb_i-2\suma_ib_i=N-2\suma_ib_i\]而:\[\sum_{b'}f(a,b')=N^2-2\sum_{b'}\sum_{i=0}^{N-1}a_ib_i\\=N^2-2\sum_{i=0}^{N-1}a_i\sum_{b'}b_i=N^2-2\t......
  • 代码随想录算法训练营第二十一天| 530. 二叉搜索树的最小绝对差 501. 二叉搜索树中的
    530.二叉搜索树的最小绝对差https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/TreeNodepre=null;intres=Integer.MAX_VALUE;publicintgetMinimumDifference(TreeNoderoot){if(root==null)return0;pr......
  • 力扣每日一题:LCR112--矩阵中的最长递增路径
    题目给定一个 mxn 整数矩阵 matrix ,找出其中 最长递增路径 的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。示例1:输入:matrix=[[9,9,4],[6,6,8],[2,1,1]]输出:4解释:最长递增路径为 [1......
  • 洛谷 P1196 [NOI2002] 银河英雄传说
    题意:30000列军队,每列初始有1个。编号从1~30000.每次操作有两种,将现在第i列所在的列合并到第j列所在列的末尾。或者查询第i列举例第j列的距离。思路:带权并查集。合并时将第i列头节点接到第j列头节点上。然后直接查询dist取绝对值相减就好。总结:一开始没看清题,以为要把从i列从当......
  • 二叉树的高效非递归层次遍历:一种O(n)时间复杂度与固定空间复杂度的解决方案
    @TOC在计算机科学中,二叉树是一种非常重要的数据结构,它在算法设计和问题解决中扮演着关键角色。本文将探讨如何使用非递归方法遍历一个给定的二叉树,并在不修改树结构的前提下,输出每个节点的关键字。这个过程将在O(n)的时间复杂度内完成,并且只使用固定量的额外存储空间。1.......