[leetcode]95.不同的二叉搜索树
- Posted by 微博@Yangsc_o
 - 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
 
95. 不同的二叉搜索树 II
给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
示例 1:

输入:n = 3
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
示例 2:
输入:n = 1
输出:[[1]]
提示:
1 <= n <= 8
解析:
先看如何构造一颗平衡二叉搜索树
func generateTrees(n int) *TreeNode {
	return helper(1, n)
}
func helper(start, end int) *TreeNode {
	if start > end {
		return nil
	}
        // 平衡二叉搜索树
	i := (start + end) / 2
	root := &TreeNode{Val: i}
	root.Left = helper(start, i-1)
	root.Right = helper(i+1, end)
	return root
}
根据题目的意思,需要在上面的代码中,在选择根结点的时候,遍历跟节点所有的可能;
即:i := (start + end) / 2 的可能值为从start到end
	for  i := start; i <= end; i++{
		root := &TreeNode{Val: i};
	}
当找到root节点时,问题就变为如何构建root的左右子树。
固定左孩子,遍历右孩子
	for _, leftNode := range left {
		for _, rightNode := range right {
			root := &TreeNode{Val: i}
			root.Left = leftNode
			root.Right = rightNode
		}
	}
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func generateTrees(n int) []*TreeNode {
    return helper(1,n)
}
func helper(start,end int) []*TreeNode {
    res := make([]*TreeNode, 0)
    if start > end {
        res = append(res, nil)
        return res
    }
    // 1.穷举所有以 i 为 root 节点的所有可能
    for i:= start; i <= end;i ++ {
        left := helper(start,i - 1)
        right := helper(i + 1 ,end)
        // 2.递归所有 root 节点的左右子树
        for _, leftNode := range left {
            for _, rightNode := range right {
                 // 3.给 root 节点穷举所有左右子树的组合
                root := &TreeNode{Val: i}
                root.Left = leftNode
                root.Right = rightNode
                res = append(res, root)
            }
        }
    }
    return res
}
参考
Krains's Blog-不同的二叉搜索树 II
你的鼓励也是我创作的动力
[leetcode]95.不同的二叉搜索树的更多相关文章
- Java实现 LeetCode 95 不同的二叉搜索树 II(二)
		
95. 不同的二叉搜索树 II 给定一个整数 n,生成所有由 1 - n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1, ...
 - LeetCode 95——不同的二叉搜索树 II
		
1. 题目 2. 解答 以 \(1, 2, \cdots, n\) 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树.当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将 ...
 - Leetcode 95.不同的二叉搜索树II
		
不同的二叉搜索树2 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null ...
 - [LeetCode] 95. 不同的二叉搜索树 II ☆☆☆(递归,n个数组成的所有二叉搜索树)
		
https://leetcode-cn.com/problems/unique-binary-search-trees-ii/solution/xiang-xi-tong-su-de-si-lu-fe ...
 - [LeetCode] 95. 不同的二叉搜索树 II
		
题目链接 : https://leetcode-cn.com/problems/unique-binary-search-trees-ii/ 题目描述: 给定一个整数 n,生成所有由 1 ... n ...
 - 95. 不同的二叉搜索树 II
		
95. 不同的二叉搜索树 II 题意 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树. 解题思路 这道题目是基于不同的二叉搜索树进行改进的: 对于连续整数序列[left, ri ...
 - 【JavaScript】Leetcode每日一题-二叉搜索树的范围和
		
[JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...
 - 【python】Leetcode每日一题-二叉搜索树节点最小距离
		
[python]Leetcode每日一题-二叉搜索树节点最小距离 [题目描述] 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 示例1: 输入:root = [4 ...
 - [LeetCode] Split BST 分割二叉搜索树
		
Given a Binary Search Tree (BST) with root node root, and a target value V, split the tree into two ...
 
随机推荐
- Vue 内置指令  &&  自定义指令
			
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 & ...
 - P4983忘情
			
今天挺开心的\(\sim\),省选加油\(!\) \(P4893\)忘情 我能说今晚我才真正学会\(wqs\)和斜率优化吗\(?\) 恰好选几个,必然需要\(wqs\)二分一下 那么考虑不考虑次数情况 ...
 - Apache DolphinScheduler 社区呼唤志愿者
			
DolphinScheduler是什么? Apache DolphinScheduler 是一个分布式.易扩展并带有强大的可视化界面的大数据工作流调度系统. 2021 年 03 月 18 日正式成为 ...
 - Node.js + Express + Knex 开发 API 接口
			
安装依赖包 npm i express knex mysql2 这是 Knex 官方文档地址:Knex.js - SQL query builder. 搭建接口 config.js 新建一个 conf ...
 - 使 Word 段落第一行空出两个字符的位置(段落首行缩进)
			
描述 使 Word 段落第一行左突出两个字符的位置,即段落首行缩进的方式有两种. "视图"选项卡--"显示"组--标尺 "开始"选项卡--& ...
 - Excel 查找函数(一):LOOKUP
			
序号 员工姓名 部门 职务 1 苏霞 法务部 法律顾问 2 包志林 财务部 财务总监 3 林娥云 安监部 部长 4 石少卿 质检部 质检员 5 于炳福 生产部 生产部 6 蒋琼志 仓储部 保管员 7 ...
 - Spring 16: SM(Spring + MyBatis) 注解式事务 与 声明式事务
			
Spring事务处理方式 方式1:注解式事务 使用@Transactional注解完成事务控制,此注解可添加到类上,则对类中所有方法执行事务的设定,注解添加到方法上,则对该方法执行事务处理 @Tran ...
 - Python入门系列(二)语法风格
			
python缩进 Python使用缩进来表示代码块,例如 if 5 > 2: print("Five is greater than two!") 如果跳过缩进,Python ...
 - flink-cdc实时同步mysql数据到elasticsearch
			
本文首发于我的个人博客网站 等待下一个秋-Flink 什么是CDC? CDC是(Change Data Capture 变更数据获取)的简称.核心思想是,监测并捕获数据库的变动(包括数据 或 数据表的 ...
 - k8s驱逐篇(4)-kube-scheduler抢占调度驱逐
			
介绍kube-scheduler抢占调度驱逐之前,先简单的介绍下kube-scheduler组件: kube-scheduler简介 kube-scheduler组件是kubernetes中的核心组件 ...