[Go版]算法通关村第五到十关总结——树和递归问题的套路和写法总结:层次遍历、前后序遍历、中序和二分查找

目录

  • 套路和写法总结
    • 层次遍历(Breadth-First Traversal)
    • 前序遍历(Preorder Traversal)
    • 后序遍历(Postorder Traversal)
    • 中序遍历(Inorder Traversal)
    • 二分查找(Binary Search)

套路和写法总结

学到这里,已经做了很多题目了,发现其中有模版存在的感觉。

层次遍历(Breadth-First Traversal)

层次遍历是按照树的层级顺序,从上到下逐层遍历节点。可以使用队列来辅助实现。

套路:

使用队列来存储当前层级的节点。
从根节点开始,将根节点入队。
循环遍历队列,依次出队节点,将其子节点入队。
重复上述步骤,直到队列为空。

func fn(root *TreeNode) [][]int {
  	ret := make([][]int, 0)
	if root == nil {
		return ret
	}
	queue := []*TreeNode{root}
	for len(queue) != 0 {
		length := len(queue)
		arr := make([]int, 0)
		for _, node := range queue {
			// 这里可以拿到当前层的每个节点,可以处理当前层所需业务逻辑
			arr = append(arr, node.Val)
			if node.Left != nil {
				queue = append(queue, node.Left)
			}
			if node.Right != nil {
				queue = append(queue, node.Right)
			}
		}
		queue = queue[length:]
		ret = append(ret, arr)
	}
	return ret
}

前序遍历(Preorder Traversal)

前序遍历是按照根-左-右的顺序遍历节点。

套路:

首先访问根节点。
递归地访问左子树。
递归地访问右子树。

func fn(root *TreeNode) []int {
	ret := make([]int, 0)
	if root == nil {
		return ret
	}
	//中
	ret = append(ret, root.Val)
	//左
	tmp := fn(root.Left)
	ret = append(ret, tmp...) 
	//右
	tmp = fn(root.Right)
	ret = append(ret, tmp...) 
	return ret
}

后序遍历(Postorder Traversal)

后序遍历是按照左-右-根的顺序遍历节点。在处理二叉树的释放资源等操作时常用到。

套路:

递归地访问左子树。
递归地访问右子树。
访问根节点。

中序遍历(Inorder Traversal)

中序遍历是按照左-根-右的顺序遍历节点。在二分搜索树中,中序遍历可以得到有序的节点序列。

套路:

递归地访问左子树。
访问根节点。
递归地访问右子树。

func fn(root *TreeNode) []int {
	ret := make([]int, 0)
	if root == nil {
		return ret
	}
	//左
	tmp := fn(root.Left)
	ret = append(ret, tmp...) 
	//中
	ret = append(ret, root.Val)
	//右
	tmp = fn(root.Right)
	ret = append(ret, tmp...) 
	return ret
}

二分查找(Binary Search)

二分查找是在有序数组中查找特定元素的有效方法。

套路:

初始化左右指针,分别指向数组的第一个和最后一个元素。
在每一步中,计算中间元素的索引。
比较中间元素与目标值的大小。
如果中间元素等于目标值,返回中间索引。
如果中间元素小于目标值,将左指针移动到中间元素的右边一位。
如果中间元素大于目标值,将右指针移动到中间元素的左边一位。
重复上述步骤,直到左指针大于右指针,表示未找到目标值。

二叉搜索树中寻找val值的节点

func fn(root *TreeNode, val int) *TreeNode {
	if root == nil {
		return nil
	}
	if root.Val == val {
		return root
	}
	if root.Val > val {
		return fn(root.Left, val)
	} else {
		return fn(root.Right, val)
	}
	return nil
}

有序数组中寻找val值的第一个索引和最后一个索引

func fn(nums []int, val int) int {
	length := len(nums)
	if length == 0 {
		return -1
	}
	return a(nums, val, 0, length-1)
}
func a(nums []int, val int, left int, right int) int {
	if left > right {
		return -1
	}
	mid := (right-left)>>1+left
	if nums[mid] == val {
		return mid
	}
	if nums[mid] > val {
		return a(nums, val, left, mid-1)
	} else {
		return a(nums, val, mid+1, right)
	}
	return -1
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/79113.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Clould 消息队列 - RabbitMQ

视频地址:微服务(SpringCloudRabbitMQDockerRedis搜索分布式) 初识MQ-同步通讯的优缺点(P61,P62) 同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话&…

比ChatGPT更强的星火大模型V2版本发布!

初体验 测试PPT生成 结果: 达到了我的预期,只需要微调就可以直接交付,这点比ChatGPT要强很多. 测试文档问答 结果: 这点很新颖,现在类似这种文档问答的AI平台收费都贵的离谱,星火不但免费支持而且效果也…

TiDB v7.1.0 跨业务系统多租户解决方案

本文介绍了 TiDB 数据库的资源管控技术,并通过业务测试验证了效果。资源管控技术旨在解决多业务共用一个集群时的资源隔离和负载问题,通过资源组概念,可以限制不同业务的计算和 I/O 资源,实现资源隔离和优先级调度,提高…

优思学院|六西格玛黑带的9大任务和7大技能

六西格玛黑带是六西格玛管理中最为重要的一个角色,他们专职(也可以是兼职)从事六西格玛改进项目,是成功完成六西格玛项目的技术骨干成员,是六西格玛组织的核心力量。他们的努力程度决定着六西格玛管理的成败。 六西格玛…

新榜 | CityWalk本地生活商业价值洞察报告

如果说现在有人问,最新的网络热词是什么? “CityWalk”,这可能是大多数人的答案。 近段时间,“CityWalk”刷屏了各种社交媒体,给网友们带来了一场“城市漫步”之旅。 脱离群体狂欢,这个在社交媒体引发热议的词汇背后又…

HCIP VLAN实验

VLAN实验 拓扑图配置和分析分析配置LSW1LSW2R1 测试dhcp获取ipICMP测试 拓扑图 配置和分析 分析 从题目来看,因为 pc 1 3都是vlan2而且还是不同网段,pc 2 4 5 6在同一网段,所以可以将pc 1 2 5 4 6分在一个网段 pc4不通5 6 ,那就…

【sgDragSize】自定义拖拽修改DIV尺寸组件,适用于窗体大小调整

核心原理就是在四条边、四个顶点加上透明的div,给不同方向提供按下移动鼠标监听 ,对应计算宽度高度、坐标变化 特性: 支持设置拖拽的最小宽度、最小高度、最大宽度、最大高度可以双击某一条边,最大化对应方向的尺寸;再…

JVM——配置常用参数,GC调优策略

文章目录 JVM 配置常用参数Java内存区域常见配置参数概览堆参数回收器参数项目中常用配置常用组合 常用 GC 调优策略GC 调优原则GC 调优目的GC 调优策略 JVM 配置常用参数 Java内存区域常见配置参数概览堆参数;回收器参数;项目中常用配置;常…

嵌入式Linux开发实操(九):CAN接口开发

前言: CAN网络在汽车中的使用可以说相当广泛。而CAN网络需要的收发器最常用的就是NXP 的TJA1042: CAN网络:

嵌入式编译FFmpeg6.0版本并且组合x264

下载直通车:我用的是6.0版本的 1.准备编译: 2.进入ffmpeg源码目录,修改Makefile,添加编译选项: CFLAGS -fPIC 不加会报错 3.使用命令直接编译 ./configure --cross-prefix/home/xxx/bin/arm-linux-gnueabihf- --enable-cross-compile --targ…

一次Linux中的木马病毒解决经历(6379端口---newinit.sh)

病毒入侵解决方案 情景 最近几天一直CPU100%,也没有注意看到了以为正常的服务调用,直到腾讯给发了邮件警告说我的服务器正在入侵其他服务器的6379端口,我就是正常的使用不可能去入侵别人的系统的,这是违法的. 排查 既然入侵6379端口,就怀疑是通过我的Redis服务进入的我的系统…

​《乡村振兴战略下传统村落文化旅游设计 》在2023年畅销榜排名465位

​《乡村振兴战略下传统村落文化旅游设计 》在2023年畅销榜排名465位

[Docker精进篇] Docker镜像构建和实践 (三)

前言: Docker镜像构建的作用是将应用程序及其依赖打包到一个可移植、自包含的镜像中,以便在不同环境中快速、可靠地部署和运行应用程序。 文章目录 Docker镜像构建1️⃣是什么?2️⃣为什么?3️⃣镜像构建一、用现有容器构建新镜像…

k8s简介及虚拟机快速搭建k8s集群

文章目录 1、k8s简介1.1、部署方式的变迁1.2、定义1.3、Kubernetes提供的功能 2、虚拟机快速搭建k8s集群2.1、虚拟机配置(centos7 2G内存2个处理器)2.2、基础环境准备2.3、docker安装(易踩坑)2.4、安装k8s组件2.5、master节点部署…

浅谈5G技术会给视频监控行业带来的一些变革情况

5G是第五代移动通信技术,能够提供更高的带宽和更快的传输速度,这将为视频技术的发展带来大量机会。随着5G技术的逐步普及与商用,人们将能够享受到更加流畅的高清视频体验,并且5G技术还拥有更低的延迟和更高的网络容量。这些优势不…

操作符详解上(非常详细)

目录 二进制介绍二进制2进制转10进制10进制转2进制数字2进制转8进制和16进制2进制转8进制2进制转16进制 原码、反码、补码移位操作符左移操作符右移操作符 位操作符:&、|、^逗号表达式 二进制介绍 在初学计算机时我们常常会听到2进制、8进制、10进制、16进制……

专访阿里云席明贤,视频云如何运用大模型与小模型来破茧升级2.0

不久前,LiveVideoStack与阿里云视频云负责人席明贤(花名右贤)展开一场深度的对话,一个是圈内专业的社区媒体,一个是20年的IT老兵,双方有交集、有碰撞、有火花。 面对风云变幻的内外环境,阿里云…

9.利用matlab完成 泰勒级数展开 和 符号表达式傅里叶变换和反变换 (matlab程序)

1.简述 matlab之傅里叶变换和逆变换 首先生成一个方波(或者其他组合波形),然后对这个信号做傅里叶变换,拆解到频域,可以看到这个信号是由哪些频率的信号叠加而来。 然后把频域信号,用傅里叶逆变换恢复到时…

linux 命令- systemctl

systemctl 参数说明 1、使用语法 用法:systemctl [OPTIONS…] {COMMAND} … 2 、参数说明 参数参数说明start立刻启动后面接的unitstop立刻关闭后面接的unitrestart立刻关闭后启动后面接的unit,亦即执行stop再start的意思reload不关闭后面接的unit的…

C语言:初阶测试错题(查漏补缺)

题一:字符串倒置 示例1 输入 I like beijing. 输出 beijing. like I 思路一: 定义字符串数组arr[ ] ,利用gets()将要倒置的字符串输入,记录字符串长度len,此时写一个逆置函数Inversion(),第一步将整个字符串逆置&…