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

news2024/10/5 15:31:28

目录

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 main

import (
	"fmt"
)

const null = -1 << 31

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *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 := 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(zigzagLevelOrder(root))
}

代码2: 迭代

package main

import (
	"fmt"
)

const null = -1 << 31

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func zigzagLevelOrder(root *TreeNode) [][]int {
	if root == nil {
		return [][]int{}
	}
	res := [][]int{}
	queue := []*TreeNode{root}
	level := 0
	for 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 := 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(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 main

import (
	"fmt"
)

const null = -1 << 31

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *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 := 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(maxDepth(root))
}

代码2: 迭代

package main

import (
	"fmt"
)

const null = -1 << 31

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func maxDepth(root *TreeNode) int {
	if root == nil {
		return 0
	}
	depth := 0
	queue := []*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 := 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(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 main

import (
	"fmt"
)

const null = -1 << 31

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *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) *TreeNode
	build = func(preStart, preEnd, inStart, inEnd int) *TreeNode {
		if preStart > preEnd {
			return nil
		}
		rootVal := preorder[preStart]
		rootIndex := index[rootVal]
		leftSize := rootIndex - inStart
		rightSize := inEnd - rootIndex
		left := 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 := 0
	for 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.coloradmin.cn/o/413333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL8.0的安装和配置

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

结合实际谈谈个人对代码优化的感想以及java优化

前言 本来想写一篇结合在实际工作中&#xff0c;自己去优化java代码的文章&#xff0c;用于记录便于复习提升自己的&#xff1b;但是在回想起自己在实际工作中诸多因素导致存在的问题&#xff08;仅针对我个人&#xff09;&#xff0c;个人总结以及去证实了&#xff0c;所悟&am…

16. unity粒子特效---旋转 + 花瓣飞舞案例

1. 旋转模块&#xff08;Rotation over Lifetime&#xff09; 在主模块中也可以设置粒子的旋转角度&#xff0c;通过参数Start Rotation&#xff0c;不过这个参数设置的是粒子刚生成时的角度&#xff0c;后面不会发生变化。 使用旋转模块可以通过参数Angular Velocity进行设置…

十一、删除市场活动

功能需求 ①用户在市场活动主页面,选择要删除的市场活动,点击"删除"按钮,弹出确认窗口; ②用户点击"确定"按钮,完成删除市场活动的功能. ③*每次至少删除一条市场活动 ④*可以批量删除市场活动 ⑤*删除成功之后,刷新市场活动列表,显示第一页数据,保持…

如何规划自己的大一生活

大家好&#xff0c;我是帅地&#xff0c;在帅地的训练营里&#xff0c;有不少大一打二大学员&#xff0c;不少学员在大一就会数据结构&#xff0c;算法等学了&#xff0c;还参加了一些实验室项目&#xff0c;这主要得益于他们规划等早。 帅地在接下来的时间里&#xff0c;会写…

心累,网站被盗刷 1.7T 流量

小伙伴们大家好&#xff0c;我是阿秀。前几天我在上班摸鱼的时候忽然收到阿里云发来的邮件说账户欠费&#xff0c;服务停止同时也有人在群里说网站图片看不到了。我当时第一反应就是 OSS 套餐超了&#xff0c;因为以前也收到过类似的邮件&#xff0c;我去年双十一的时候买了一个…

JUC高级八-Java对象内存布局和对象头

JUC高级八-Java对象内存布局和对象头 1. 对象的内存布局 在HotSpot虚拟机里&#xff0c;对象在堆内存中的存储布局可以划分为三个部分:对象头(Header&#xff09;、实例数据&#xff08;Instance Data&#xff09;和对齐填充(Padding)&#xff08;保证8个字节的倍数&#xff…

【java】泛型编程

文章目录泛型类泛型与多态泛型方法泛型界限设置上界设置下界类型擦除函数式接口Supplier供给型函数式接口Consumer消费型函数式接口Function函数型函数式接口Predicate断言型函数式接口判空包装泛型类 package com.test.entity; public class Score<T> {String name;Str…

一文搞懂Session和JWT登录认证

前言 目前在开发的小组结课项目中用到了JWT认证&#xff0c;简单分享一下&#xff0c;并看看与Session认证的异同。 登录认证&#xff08;Authentication&#xff09;的概念非常简单&#xff0c;就是通过一定手段对用户的身份进行确认。 我们都知道 HTTP 是无状态的&#xf…

模型实战(9)之YOLOv8预测模块predictor详解、预测视频后同时保存结果视频+目标帧

YOLOv8预测模块predictor详解、预测视频后同时保存结果视频+目标帧 Ultralytics YOLOv8Ultralytics YOLOv8是最新版本的YOLO对象检测和图像分割模型。 作为一种尖端的、最先进的(SOTA)模型,YOLOv8建立在以前版本的成功基础上,引入了新的功能和改进,以增强性能、灵活性和效率…

高速Serdes技术(FPGA领域应用)

目录引入一、Serdes&#xff08;概念-历程&#xff09;1、概念2、技术现状3、发展历程二、Serdes结构三、在FPGA领域中的运用四、Serdes跟Lvds的关系五、Xilinx 有关 serdes的文档六、参考文献引入 回顾接口技术发展历史&#xff0c;其实数据的传输最开始是低速的串行接口&…

202307读书笔记|《双向奔赴的爱,才是人间理想》——爱是双向奔赴,共同成长

《双向奔赴的爱&#xff0c;才是人间理想》作者燕七&#xff0c;读作者的第一本书是《鲸鱼安慰&#x1f433;了大海》可太美了&#xff0c;这次订阅通知这本&#xff0c;立马加入了书架&#xff0c;跑完步读了起来。没有第一本惊艳&#xff0c;但也不错&#xff0c;值得一读&am…

JavaScript对象的属性描述符(Property Descriptor)介绍

JavaScript对象的属性描述符&#xff08;Property Descriptor&#xff09;介绍 JavaScript 中的对象&#xff08;Object&#xff09;是一个包含相关数据和方法的集合&#xff0c;通常由一些变量和函数组成&#xff0c;我们称之为对象里面的属性&#xff08;property&#xff0…

java springboot工程RESTful入门案例 认识请求类型 参数

我们先创建一个java的springboot工程 然后 我们先用老方式试一下 在启动类的同级创建目录controller 下面创建一个类 叫 UserController 参考代码如下 package com.example.threshold.controller;import org.springframework.web.bind.annotation.GetMapping; import org.spri…

负载均衡与DNS轮询

负载均衡 load balance 负载均衡&#xff08;Load Balancing&#xff09;是一种将工作负载&#xff08;Workload&#xff09;分摊到多个计算资源&#xff08;服务器、存储设备、网络设备等&#xff09;上的技术&#xff0c;目的是提高系统的可用性、性能和扩展性。负载均衡可以…

序列化和反序列化二叉树 -----前序,中序,后序,层序

目录 一.序列化和反序列化 1.什么是序列化和反序列化 二.前序遍历 1.序列化 1.问题分析 2.代码实现 2.反序列化 1.问题分析 2.代码实现 三.后序遍历 1.序列化 1.思路分析 2.代码实现 2.反序列化 1.思路分析 2.代码实现 四.中序遍历 1.序列化 1.思路分析 2.代…

SpringBoot 使用Prometheus采集自定义指标数据

一、我们需要什么指标 对于DDD、TDD等&#xff0c;大家比较熟悉了&#xff0c;但是对于MDD可能就比较陌生了。MDD是Metrics-Driven Development的缩写&#xff0c;主张开发过程由指标驱动&#xff0c;通过实用指标来驱动快速、精确和细粒度的软件迭代。MDD可使所有可以测量的东…

RPC调用框架简单介绍

一.Thrift Apache Doris目前使用的RPC调度框架。Thrift是一款基于CS&#xff08;client -server&#xff09;架构的RPC通信框架&#xff0c;开发人员可以根据定义Thrift的IDL(interface decription language)文件来定义数据结构和服务接口&#xff0c;灵活性高&#xff0c;支持…

Leetcode.2583 二叉树中的第 K 大层和

题目链接 Leetcode.2583 二叉树中的第 K 大层和 Rating &#xff1a; 1374 题目描述 给你一棵二叉树的根节点 root和一个正整数 k 。 树中的 层和 是指 同一层 上节点值的总和。 返回树中第 k 大的层和&#xff08;不一定不同&#xff09;。如果树少于 k 层&#xff0c;则返…

INFINONE XC164单片机逆向记录(5)C166地址系统

本人所写的博客都为开发之中遇到问题记录的随笔,主要是给自己积累些问题。免日后无印象,如有不当之处敬请指正(欢迎进扣群 24849632 探讨问题); 写在专栏前面https://blog.csdn.net/Junping1982/article/details/129955766 INFINONE XC164单片机逆向记录(1)资料准备