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

你的鼓励也是我创作的动力

打赏地址

最新文章

  1. mybatis 细粒度控制二级缓存
  2. deep learning 练习 多变量线性回归
  3. Ubuntu 循环遍历当前目录下所有文本文件中的字符
  4. 另一个SqlParameterCollection中已包含SqlParameter
  5. 二分---LIGHTOJ 1062
  6. What the hell is Rotate?
  7. Python按行读文件对比
  8. Delphi与C++的语法区别(六点区别) good
  9. Sql Server——查询(二)
  10. Environment.getExternalStorageDirectory()
  11. 部署:持续集成(CI)与持续交付(CD)——《微服务设计》读书笔记
  12. C语言之输出空心棱形图案
  13. centos下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named &#39;_ctypes&#39;
  14. Linux网站运维工程师基础大纲
  15. 【读书笔记】iOS-对iOS应用进行模糊测试
  16. HTTP记录-HTTP介绍
  17. Java DataSource
  18. fprintf输出到文件中,sprintf输出到字符串中. 如: fprintf(fp,&quot;%s&quot;,name); fp为文件指针 sprintf(buff,&quot;%s&quot;,name); buff为字符数组
  19. 【dlbook】机器学习基础
  20. 符合mvc思维的分页思想

热门文章

  1. Mac os:将Homebrew的下载源换成国内镜像增加下载速度(阿里云镜像)
  2. Linux环境监控工具汇总
  3. 【Java面试】什么是IO的多路复用机制?
  4. js仿toDoList(待办事项)练习
  5. Excel 文本函数(一):LEFT、RIGHT 和 MID
  6. [CTSC2007]数据备份Backup (贪心)
  7. C#基础_枚举
  8. 【Java】学习路径61-“伪”枚举类型
  9. Html飞机大战(三):定义状态
  10. 使用【阿里云】服务器、【Xshell】搭建自己的【网站】—— { }