Golang每日一练(leetDay0032) 二叉树专题(1)

简介: Golang每日一练(leetDay0032) 二叉树专题(1)

二叉树专题(1)

94. 二叉树的中序遍历 Binary Tree Inorder Traversal


给定一个二叉树的根节点 root ,返回 它的 中序 遍历


示例 1:

aec3c5ecd1cb4c1923481b43f733189d.jpeg


输入:root = [1,null,2,3]

输出:[1,3,2]


示例 2:

输入:root = []

输出:[]


示例 3:

输入:root = [1]

输出:[1]


提示:

   树中节点数目在范围 [0, 100] 内

   -100 <= Node.val <= 100


进阶: 递归算法很简单,你可以通过迭代算法完成吗?

代码1: 递归法

package main
import (
  "fmt"
)
const null = -1 << 31
type TreeNode struct {
  Val   int
  Left  *TreeNode
  Right *TreeNode
}
func inorderTraversal(root *TreeNode) []int {
  var res []int
  inorder(root, &res)
  return res
}
func inorder(root *TreeNode, res *[]int) {
  if root == nil {
    return
  }
  inorder(root.Left, res)
  *res = append(*res, root.Val)
  inorder(root.Right, res)
}
func buildTree(nums []int) *TreeNode {
  if len(nums) == 0 {
    return nil
  }
  root := &TreeNode{Val: nums[0]}
  Queue := []*TreeNode{root}
  idx := 1
  for idx < len(nums) {
    node := Queue[0]
    Queue = Queue[1:]
    if nums[idx] != null {
      node.Left = &TreeNode{Val: nums[idx]}
      Queue = append(Queue, node.Left)
    }
    idx++
    if idx < len(nums) && nums[idx] != null {
      node.Right = &TreeNode{Val: nums[idx]}
      Queue = append(Queue, node.Right)
    }
    idx++
  }
  return root
}
func ArrayToString(arr []int) string {
  res := "["
  for i := 0; i < len(arr); i++ {
    res += fmt.Sprint(arr[i])
    if i != len(arr)-1 {
      res += ","
    }
  }
  return res + "]"
}
func main() {
  nums := []int{1, null, 2, 3}
  root := buildTree(nums)
  fmt.Println(ArrayToString(inorderTraversal(root)))
  nums = []int{3, 9, 20, null, null, 15, 7}
  root = buildTree(nums)
  fmt.Println(ArrayToString(inorderTraversal(root)))
}

代码2: 迭代法

package main
import (
  "fmt"
)
const null = -1 << 31
type TreeNode struct {
  Val   int
  Left  *TreeNode
  Right *TreeNode
}
func inorderTraversal(root *TreeNode) []int {
  var res []int
  stack := []*TreeNode{}
  cur := root
  for cur != nil || len(stack) > 0 {
    for cur != nil {
      stack = append(stack, cur)
      cur = cur.Left
    }
    cur = stack[len(stack)-1]
    stack = stack[:len(stack)-1]
    res = append(res, cur.Val)
    cur = cur.Right
  }
  return res
}
func buildTree(nums []int) *TreeNode {
  if len(nums) == 0 {
    return nil
  }
  root := &TreeNode{Val: nums[0]}
  Queue := []*TreeNode{root}
  idx := 1
  for idx < len(nums) {
    node := Queue[0]
    Queue = Queue[1:]
    if nums[idx] != null {
      node.Left = &TreeNode{Val: nums[idx]}
      Queue = append(Queue, node.Left)
    }
    idx++
    if idx < len(nums) && nums[idx] != null {
      node.Right = &TreeNode{Val: nums[idx]}
      Queue = append(Queue, node.Right)
    }
    idx++
  }
  return root
}
func ArrayToString(arr []int) string {
  res := "["
  for i := 0; i < len(arr); i++ {
    res += fmt.Sprint(arr[i])
    if i != len(arr)-1 {
      res += ","
    }
  }
  return res + "]"
}
func main() {
  nums := []int{1, null, 2, 3}
  root := buildTree(nums)
  fmt.Println(ArrayToString(inorderTraversal(root)))
  nums = []int{3, 9, 20, null, null, 15, 7}
  root = buildTree(nums)
  fmt.Println(ArrayToString(inorderTraversal(root)))
}

输出:

[1,3,2]

[9,3,15,20,7]





95. 不同的二叉搜索树 II Unique Binary Search Trees II


给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。


示例 1:

100de0cac1d32a86ef4151ee910ede60.jpeg




输入: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

代码1: 递归法

type TreeNode struct {
    Val int
    Left *TreeNode
    Right *TreeNode
}
func generateTrees(n int) []*TreeNode {
    if n == 0 {
        return []*TreeNode{}
    }
    return generate(1, n)
}
func generate(start, end int) []*TreeNode {
    if start > end {
        return []*TreeNode{nil}
    }
    var res []*TreeNode
    for i := start; i <= end; i++ {
        left := generate(start, i-1)
        right := generate(i+1, end)
        for _, l := range left {
            for _, r := range right {
                res = append(res, &TreeNode{i, l, r})
            }
        }
    }
    return res
}



代码2: 动态规划

type TreeNode struct {
    Val int
    Left *TreeNode
    Right *TreeNode
}
func generateTrees(n int) []*TreeNode {
    if n == 0 {
        return []*TreeNode{}
    }
    dp := make([][]*TreeNode, n+1)
    dp[0] = []*TreeNode{nil}
    for i := 1; i <= n; i++ {
        var res []*TreeNode
        for j := 1; j <= i; j++ {
            for _, l := range dp[j-1] {
                for _, r := range dp[i-j] {
                    res = append(res, &TreeNode{j, l, r})
                }
            }
        }
        dp[i] = res
    }
    return dp[n]
}



96. 不同的二叉搜索树 Unique Binary Search Trees

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

示例 1:

a86c8b8b2c41ef25ff1361cf97f0aeaa.jpeg



输入:n = 3

输出:5


示例 2:

输入:n = 1

输出:1


提示:

  • 1 <= n <= 19

代码1: 动态规划

func numTrees(n int) int {
    dp := make([]int, n+1)
    dp[0] = 1
    for i := 1; i <= n; i++ {
        for j := 1; j <= i; j++ {
            dp[i] += dp[j-1] * dp[i-j]
        }
    }
    return dp[n]
}


代码2: 组合

卡特兰数Cn满足以下递推式: C0 = 1, Cn+1 = 2(2n+1)/(n+2) * Cn


func numTrees(n int) int {
    c := 1
    for i := 0; i < n; i++ {
        c = c * 2 * (2*i+1) / (i+2)
    }
    return c
}
目录
相关文章
|
Shell Linux 算法
Shell编程——弱数据类型的脚本语言快速入门指南
Shell编程——弱数据类型的脚本语言快速入门指南
182 0
Shell编程——弱数据类型的脚本语言快速入门指南
|
Go Linux Shell
Linux 终端命令之文件浏览(2) more
Linux 终端命令之文件浏览(2) more
136 0
Linux 终端命令之文件浏览(2) more
|
Shell 机器学习/深度学习 Linux
Linux 终端操作命令(2)内部命令
Linux 终端操作命令(2)内部命令
243 0
Linux 终端操作命令(2)内部命令
|
C++ 算法 存储
力扣 C++|一题多解之动态规划专题(2)
力扣 C++|一题多解之动态规划专题(2)
193 0
力扣 C++|一题多解之动态规划专题(2)
|
Python 索引
Python Numpy入门基础(一)创建数组
Python Numpy入门基础(一)创建数组
225 0
Python Numpy入门基础(一)创建数组
|
Java 容器 程序员
Java语言程序设计试卷6套
Java语言程序设计试卷6套
1120 0
Java语言程序设计试卷6套
|
16天前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
68 1
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
522 4
Golang语言之管道channel快速入门篇
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
205 4
Golang语言文件操作快速入门篇
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
452 3
Golang语言之gRPC程序设计示例

热门文章

最新文章

推荐镜像

更多