Golang每日一练(leetDay0037) 二叉树专题(6)

简介: Golang每日一练(leetDay0037) 二叉树专题(6)

二叉树专题(6)


109. 有序链表转换二叉搜索树 Convert-sorted-list-to-binary-search-tree


给定一个单链表的头节点  head ,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。  


示例 1:

80f8827c2d2b19f4ba83a0feee624b1b.jpeg



输入: head = [-10,-3,0,5,9]

输出: [0,-3,9,-10,null,5]

解释: 一个可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜索树。


示例 2:

输入: head = []

输出: []

提示:

   head 中的节点数在[0, 2 * 10^4] 范围内

   -10^5 <= Node.val <= 10^5

代码:


package main
import (
  "fmt"
  "strconv"
)
const null = -1 << 31
type ListNode struct {
  Val  int
  Next *ListNode
}
type TreeNode struct {
  Val   int
  Left  *TreeNode
  Right *TreeNode
}
func sortedListToBST(head *ListNode) *TreeNode {
  var nodes []ListNode
  for head != nil {
    nodes = append(nodes, *head)
    head = head.Next
  }
  return builder(nodes, 0, len(nodes)-1)
}
func builder(nodes []ListNode, left, right int) *TreeNode {
  if left > right {
    return nil
  }
  mid := (left + right + 1) / 2
  root := &TreeNode{nodes[mid].Val, nil, nil}
  root.Left = builder(nodes, left, mid-1)
  root.Right = builder(nodes, mid+1, right)
  return root
}
func ArrayToList(list []int) *ListNode {
  head := &ListNode{Val: 0}
  for i := len(list) - 1; i >= 0; i-- {
    p := &ListNode{Val: list[i]}
    p.Next = head.Next
    head.Next = p
  }
  return head.Next
}
func levelOrder(root *TreeNode) string {
  if root == nil {
    return "[]"
  }
  arr := []int{}
  que := []*TreeNode{root}
  for len(que) > 0 {
    levelSize := len(que)
    for i := 0; i < levelSize; i++ {
      node := que[0]
      que = que[1:]
      if node == nil {
        arr = append(arr, null)
        continue
      }
      arr = append(arr, node.Val)
      que = append(que, node.Left, node.Right)
    }
  }
  size := len(arr)
  for size > 0 && arr[size-1] == null {
    arr = arr[:size-1]
    size = len(arr)
  }
  result := "["
  for i, n := range arr {
    if n == null {
      result += "null"
    } else {
      result += strconv.FormatInt(int64(n), 10)
    }
    if i < size-1 {
      result += ","
    } else {
      result += "]"
    }
  }
  return result
}
func main() {
  nums := []int{-10, -3, 0, 5, 9}
  head := ArrayToList(nums)
  root := sortedListToBST(head)
  fmt.Println(levelOrder(root))
  nums2 := []int{}
  head = ArrayToList(nums2)
  root = sortedListToBST(head)
  fmt.Println(levelOrder(root))
}

输出:

[0,-3,9,-10,null,5]

[]


110. 平衡二叉树 Balanced Binary Tree


给定一个二叉树,判断它是否是高度平衡的二叉树。


本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

dbe9d03b5c5352130598edd18fca99a0.jpeg


输入:root = [3,9,20,null,null,15,7]

输出:true


示例 2:

d5173bffc9f2bc2aa807b99a235865d7.jpeg

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

输出:false


示例 3:

输入:root = []

输出:true


提示:

   树中的节点数在范围 [0, 5000] 内

   -10^4 <= Node.val <= 10^4

代码:

package main
import (
  "fmt"
)
const null = -1 << 31
type TreeNode struct {
  Val   int
  Left  *TreeNode
  Right *TreeNode
}
func isBalanced(root *TreeNode) bool {
  if root == nil {
    return true
  }
  leftHight := depth(root.Left)
  rightHight := depth(root.Right)
  return abs(leftHight-rightHight) <= 1 && isBalanced(root.Left) && isBalanced(root.Right)
}
func depth(root *TreeNode) int {
  if root == nil {
    return 0
  }
  return max(depth(root.Left), depth(root.Right)) + 1
}
func abs(x int) int {
  if x < 0 {
    return -x
  }
  return x
}
func max(x, y int) int {
  if x > y {
    return x
  }
  return y
}
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 main() {
  nums := []int{3, 9, 20, null, null, 15, 7}
  root := buildTree(nums)
  fmt.Println(isBalanced(root))
  nums2 := []int{1, 2, 2, 3, 3, null, null, 4, 4}
  root = buildTree(nums2)
  fmt.Println(isBalanced(root))
  nums3 := []int{}
  root = buildTree(nums3)
  fmt.Println(isBalanced(root))
}

输出:

true

false

true


111. 二叉树的最小深度 Minimum Depth of Binary Tree


给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。


说明:叶子节点是指没有子节点的节点。

示例 1:

c249927bea1319c369833f66c69e9f2c.jpeg

输入:root = [3,9,20,null,null,15,7]

输出:2


示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]

输出:5

提示:

   树中节点数的范围在 [0, 10^5] 内

   -1000 <= Node.val <= 1000


代码:

package main
import (
  "fmt"
)
const null = -1 << 31
type TreeNode struct {
  Val   int
  Left  *TreeNode
  Right *TreeNode
}
func minDepth(root *TreeNode) int {
  if root == nil {
    return 0
  }
  if root.Left == nil {
    return minDepth(root.Right) + 1
  }
  if root.Right == nil {
    return minDepth(root.Left) + 1
  }
  return min(minDepth(root.Left), minDepth(root.Right)) + 1
}
func min(x, y int) int {
  if x < y {
    return x
  }
  return y
}
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 main() {
  nums := []int{3, 9, 20, null, null, 15, 7}
  root := buildTree(nums)
  fmt.Println(minDepth(root))
  nums2 := []int{2, null, 3, null, 4, null, 5, null, 6}
  root = buildTree(nums2)
  fmt.Println(minDepth(root))
}



输出:

2

5

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