博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Leetcode】95~96 不同的二叉搜索树
阅读量:5819 次
发布时间:2019-06-18

本文共 2576 字,大约阅读时间需要 8 分钟。

Leetcode 95

不同的二叉搜索树 II

输入: 3

输出:

[  [1,null,3,2],  [3,2,null,1],  [3,1,null,null,2],  [2,1,3],  [1,null,2,null,3]]

解释:

以上的输出对应以下 5 种不同结构的二叉搜索树:

1         3     3      2      1    \       /     /      / \      \     3     2     1      1   3      2    /     /       \                 \   2     1         2                 3

Leetcode 86

不同的二叉搜索树

给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?

示例:

输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树:   1         3     3      2      1    \       /     /      / \      \     3     2     1      1   3      2    /     /       \                 \   2     1         2                 3

题解

搜索二叉树(BST)的定义

若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

给点一个数,去构造BST.

[1, 2, 3]
可以把这个数列做左子树和右子树的划分:
[1] [2, 3]
[1, 2] [3]

[1, 2] [2, 3] 又可以做左子树和右子树的划分.这是一个递归的过程.

把递归的结果构造起来,即可成为答案.

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {    public List
generateTrees(int n) { if (n == 0) return new ArrayList<>(); return generateBST(1, n); } private List
generateBST(int left, int right) { List
res = new LinkedList<>(); if (left > right) { // 划分不到的时候,这时候填null. res.add(null); return res; } for (int i = left; i <= right; i++) { List
leftTrees = generateBST(left, i - 1); List
rightTrees = generateBST(i + 1, right); for (TreeNode leftTree : leftTrees) { for (TreeNode rightTree : rightTrees) { // 注意,每个循环都要构造新的节点,不能在for 循环外面生成. TreeNode root = new TreeNode(i); root.left = leftTree; root.right = rightTree; res.add(root); } } } return res; }}

如果只需要数目,不需要生成具体的BST的话,只要能求出左子树有几种构造,右子树有几种构造,就可以最终确定.

而确定左子树和右子树的问题的时候,又可以划分为子问题.

eg:
求 [1,2,3,4] 依赖于:
[1,2,3] [2,3,4]
又依赖于:
[1,2] [2,3] [3,4]的构造有几种.

class Solution {    public int numTrees(int n) {        int[] res = new int[n + 2];        res[0] = 1;        res[1] = 1;        // 没有左子树和右子树        res[2] = 2;        for (int i = 3; i <= n; i++) {            // 从3求到n            for (int j = 1; j <= i; j++) {            // 求解过程中,需要依赖于之前的解,状态转移方程为每一种划分的左子树和右子树的构造方法乘积.                    res[i] += res[j - 1] * res[i - j];            }        }        return res[n];    }}

Leetcode名企之路

转载地址:http://fkzdx.baihongyu.com/

你可能感兴趣的文章
C++_了解虚函数的概念
查看>>
全新jmeter视频已经上架
查看>>
Windows 8下如何删除无线配置文件
查看>>
解决Windows 7中文件关联和打开方式
查看>>
oracle系列(五)高级DBA必知的Oracle的备份与恢复(全录收集)
查看>>
hp 服务器通过串口重定向功能的使用
查看>>
国外10大IT网站和博客网站
查看>>
对java语言学习的个人看法
查看>>
android第十一期 - SmoothSwitchLibrary仿IOS切换Activity动画效果
查看>>
zabbix 批量web url监控
查看>>
大容量导入和导出数据 -- 格式化文件生成
查看>>
MongoDB CookBook读书笔记之导入导出
查看>>
mysql高可用方案之Keepalived+主主复制
查看>>
Nginx+PHP7 安装及配置
查看>>
KeyPass密码管理软件使用说明
查看>>
shell如何快速锁定所有账号
查看>>
听比喻,懂原理(1)超五类双绞线和六类双绞线的区别
查看>>
HTML 5实现的手机摇一摇
查看>>
Linux 文件IO理解
查看>>
Ninject 2.x细说---2.绑定和作用域
查看>>