Golang每日一练(leetDay0035) 二叉树专题(4)

news/2024/11/30 8:59:39/

目录

103. 二叉树的锯齿形层序遍历 Binary Tree Zigzag Level Order Traversal  🌟🌟

104. 二叉树的最大深度 Maximum Depth of Binary-tree]  🌟

105. 从前序与中序遍历序列构造二叉树 Construct-binary-tree-from-preorder-and-inorder-traversal  🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


二叉树专题(4)

103. 二叉树的锯齿形层序遍历 Binary Tree Zigzag Level Order Traversal

给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

示例 1:

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

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -100 <= Node.val <= 100

代码1: 递归

package mainimport ("fmt"
)const null = -1 << 31type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}func zigzagLevelOrder(root *TreeNode) [][]int {res := [][]int{}dfs(root, 0, &res)return res
}func dfs(node *TreeNode, level int, res *[][]int) {if node == nil {return}if len(*res) <= level {*res = append(*res, []int{})}if level%2 == 0 {(*res)[level] = append((*res)[level], node.Val)} else {(*res)[level] = append([]int{node.Val}, (*res)[level]...)}dfs(node.Left, level+1, res)dfs(node.Right, level+1, res)
}func buildTree(nums []int) *TreeNode {if len(nums) == 0 {return nil}root := &TreeNode{Val: nums[0]}Queue := []*TreeNode{root}idx := 1for 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(zigzagLevelOrder(root))
}

代码2: 迭代

package mainimport ("fmt"
)const null = -1 << 31type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}func zigzagLevelOrder(root *TreeNode) [][]int {if root == nil {return [][]int{}}res := [][]int{}queue := []*TreeNode{root}level := 0for len(queue) > 0 {size := len(queue)levelRes := []int{}stack := []*TreeNode{}for i := 0; i < size; i++ {node := queue[0]queue = queue[1:]levelRes = append(levelRes, node.Val)if level%2 == 0 {if node.Left != nil {stack = append(stack, node.Left)}if node.Right != nil {stack = append(stack, node.Right)}} else {if node.Right != nil {stack = append(stack, node.Right)}if node.Left != nil {stack = append(stack, node.Left)}}}for i := len(stack) - 1; i >= 0; i-- {queue = append(queue, stack[i])}res = append(res, levelRes)level++}return res
}func buildTree(nums []int) *TreeNode {if len(nums) == 0 {return nil}root := &TreeNode{Val: nums[0]}Queue := []*TreeNode{root}idx := 1for 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(zigzagLevelOrder(root))
}

输出:

[[3] [20 9] [15 7]]


104. 二叉树的最大深度 Maximum Depth of Binary-tree]

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

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

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

示例:
给定二叉树 [3,9,20,null,null,15,7]

    3/ \9  20/  \15   7

返回它的最大深度 3 。

代码1: 递归

package mainimport ("fmt"
)const null = -1 << 31type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}func maxDepth(root *TreeNode) int {if root == nil {return 0}leftDepth := maxDepth(root.Left)rightDepth := maxDepth(root.Right)return max(leftDepth, rightDepth) + 1
}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 := 1for 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(maxDepth(root))
}

代码2: 迭代

package mainimport ("fmt"
)const null = -1 << 31type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}func maxDepth(root *TreeNode) int {if root == nil {return 0}depth := 0queue := []*TreeNode{root}for len(queue) > 0 {size := len(queue)for i := 0; i < size; i++ {node := queue[0]queue = queue[1:]if node.Left != nil {queue = append(queue, node.Left)}if node.Right != nil {queue = append(queue, node.Right)}}depth++}return depth
}func buildTree(nums []int) *TreeNode {if len(nums) == 0 {return nil}root := &TreeNode{Val: nums[0]}Queue := []*TreeNode{root}idx := 1for 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(maxDepth(root))
}

输出:

3


105. 从前序与中序遍历序列构造二叉树 Construct-binary-tree-from-preorder-and-inorder-traversal

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

示例 1:

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

示例 2:

输入: preorder = [-1], inorder = [-1]
输出: [-1] 

提示:

  • 1 <= preorder.length <= 3000
  • inorder.length == preorder.length
  • -3000 <= preorder[i], inorder[i] <= 3000
  • preorder 和 inorder 均 无重复 元素
  • inorder 均出现在 preorder
  • preorder 保证 为二叉树的前序遍历序列
  • inorder 保证 为二叉树的中序遍历序列

代码:

package mainimport ("fmt"
)const null = -1 << 31type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}func buildTree(preorder []int, inorder []int) *TreeNode {index := make(map[int]int)for i, val := range inorder {index[val] = i}var build func(preStart, preEnd, inStart, inEnd int) *TreeNodebuild = func(preStart, preEnd, inStart, inEnd int) *TreeNode {if preStart > preEnd {return nil}rootVal := preorder[preStart]rootIndex := index[rootVal]leftSize := rootIndex - inStartrightSize := inEnd - rootIndexleft := build(preStart+1, preStart+leftSize, inStart, rootIndex-1)right := build(preEnd-rightSize+1, preEnd, rootIndex+1, inEnd)return &TreeNode{Val: rootVal, Left: left, Right: right}}return build(0, len(preorder)-1, 0, len(inorder)-1)
}func LevelOrder(root *TreeNode) [][]int {if root == nil {return [][]int{}}res := [][]int{}queue := []*TreeNode{root}level := 0for len(queue) > 0 {size := len(queue)levelRes := []int{}stack := []*TreeNode{}for i := 0; i < size; i++ {node := queue[0]queue = queue[1:]levelRes = append(levelRes, node.Val)if node.Right != nil {stack = append(stack, node.Right)}if node.Left != nil {stack = append(stack, node.Left)}}for i := len(stack) - 1; i >= 0; i-- {queue = append(queue, stack[i])}res = append(res, levelRes)level++}return res
}func main() {preorder := []int{3, 9, 20, 15, 7}inorder := []int{9, 3, 15, 20, 7}root := buildTree(preorder, inorder)fmt.Println(LevelOrder(root))
}

输出:

[[3] [9 20] [15 7]]


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


http://www.ppmy.cn/news/41626.html

相关文章

关于加强供水企业营销管理的几点思考

供水营销部门是供水企业最重要的职能部门之一&#xff0c;其工作职能直接与供水企业的经济利益和社会效益息息相关&#xff0c;具体来说&#xff0c;主要涉及到五个方面的指标内容&#xff1a;水费回收率、 水量漏损率&#xff08;产销差率&#xff09;、水表完好率、水价调整及…

GitHub使用教程

0 简介 GitHub 是基于 Git 的一个代码托管网站。开发者可以将代码在 GitHub 上开源&#xff0c;可以浏览其它项目的代码&#xff0c;fork 到自己名下做修改&#xff0c;clone 回本地&#xff08;没有访问权限的 private repo 除外&#xff09;使用&#xff0c;也可以发起 pull …

C++ Primer第五版_第十二章习题答案(1~10)

文章目录练习12.1练习12.2头文件函数练习12.3练习12.4练习12.5练习12.6练习12.7练习12.8练习12.9练习12.10练习12.1 在此代码的结尾&#xff0c;b1 和 b2 各包含多少个元素&#xff1f; StrBlob b1; {StrBlob b2 {"a", "an", "the"};b1 b2;b2.…

[golang gin框架] 18.GoLang 图像处理,剪切图片,生成图片二维码

一.GoLang 图像处理、图片剪切本次使用的图像处理插件是go_image,插件地址为:https://github.com/hunterhug/go_image使用该插件需导入对应的包,操作如下导入go_image在对应的go文件import中,增加如下代码import ("github.com/hunterhug/go_image" )然后在项目main.g…

查看 Elasticsearch 分析器

分析器决定了文本字段如何被拆分和索引&#xff0c;选择合适的分析器可以提高搜索的精度和效率。 那么&#xff0c;如何查看 Elasticsearch 中使用的什么分词器呢&#xff1f; 要查看 Elasticsearch 中使用的分析器&#xff0c;可以查看索引的映射信息。 GET /<index name…

C/C++程序的内存分区

文章目录堆区栈区静态存储区代码区总结正确理解C/C程序的内存分区&#xff0c;对程序员来说是最基本的要求。网络上流形两大版本内存分区&#xff0c;分别为&#xff1a;五大内存分区&#xff1a;堆、栈、全局/静态存储区、自由存储区和常量存储区。五大内存分区&#xff1a;堆…

【安全防御】防火墙

目录 1.什么是防火墙&#xff1f; 2.状态防火墙的工作原理&#xff1f; 3.防火墙实验 1.什么是防火墙&#xff1f; 防火墙&#xff08;英语&#xff1a;Firewall&#xff09;&#xff0c;也称防护墙&#xff0c;是由Check Point 创立者Gil Shwed于1993 年发明并引入国际互联…

【学习IO流】

学习内容&#xff1a; 概述 字节流 字符集 字符流 缓冲流 转换流 序列化和反序列化流 打印流 解压缩/压缩流 Commons-io 学习产出&#xff1a; 概述 存储和读取数据的解决方案 我们首先要了解File&#xff08;只能对文件本身做操作&#xff09; IO流&#xff08;可以读写数据&a…