二叉树Golang

二叉树

前言

  • 完全二叉树
    • 最底层节点按顺序从左到右排列。
  • 满二叉树
    • 一颗二叉树只有0度和2度的节点。
  • 二叉搜索树
    • 左子树上的所有节点的值均小于根节点的值。
    • 右子树上的所有节点的值均大于根节点的值。
  • 平衡二叉搜索树
    • 左右两个子树的高度差的绝对值不超过1 。

二叉树的存储方式有链式存储和数组存储。(线索二叉树、红黑树等)

1、链表存储方式

type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}func NewTreeNode(val int) *TreeNode {return &TreeNode{Val: val}
}

2、数组存储方式

	// 完全二叉树:         1//                  /   \//                 2     3//                / \   / \//               4   5 6   7// 以下为前中后序遍历,以下例子也是这个结果//	1245367 //	4251637//	4526731

左子树:2 * i + 1

右子树:2 * i + 2

(i是数组的下标),元素值为arr[ 2 * i + 1 ]或arr[ 2 * i + 2 ]

接下来将讲解二叉树的几种遍历方式,我全篇使用链式存储结构。

一、深度优先遍历

1、前序遍历

1、递归遍历

// 前序遍历:根 -> 左 -> 右
func preorderTraversal(root *TreeNode) {if root != nil {fmt.Println(root.Val)         // 访问根节点preorderTraversal(root.Left)  // 递归遍历左子树preorderTraversal(root.Right) // 递归遍历右子树}
}

2、迭代遍历

深度优先遍历的递归版本都是简洁易读的,相较于迭代版本,更直观。迭代版本使用到了一种数据结构栈,以下我使用的栈是自己封装的库函数,如果有感兴趣的朋友,可以看shard库介绍,写shard库主要还是由于Golang没提供更多的数据结构模版。

// 前序遍历:根 -> 左 -> 右(迭代实现)
func preorderTraversal(root *TreeNode) {if root == nil {return}// 栈存放的全是 *TreeNodes := shard.NewStackArray[*TreeNode]()s.Push(root)for s.Len() > 0 {// 栈顶弹出并删除node, _ := s.Pop()fmt.Println(node.Val)// 先压右子节点,再压左子节点,因为栈是后进先出(LIFO)if node.Right != nil {s.Push(node.Right)}if node.Left != nil {s.Push(node.Left)}}
}

2、中序遍历

1、递归遍历

// 中序遍历:左 -> 根 -> 右
func inorderTraversal(root *TreeNode) {if root != nil {inorderTraversal(root.Left)  // 递归遍历左子树fmt.Println(root.Val)        // 访问根节点inorderTraversal(root.Right) // 递归遍历右子树}
}

2、迭代遍历

// 中序遍历:左 -> 根 -> 右(迭代实现)
func inorderTraversal(root *TreeNode) {if root == nil {return}// 栈存放的全是 *TreeNodes := shard.NewStackArray[*TreeNode]()cur := rootfor cur != nil || !s.IsEmpty() {for cur != nil {s.Push(cur)cur = cur.Left}node, _ := s.Pop()fmt.Println(node.Val)cur = node.Right}
}

3、后序遍历

1、递归遍历

// 后序遍历:左 -> 右 -> 根
func postorderTraversal(root *TreeNode) {if root != nil {postorderTraversal(root.Left)  // 递归遍历左子树postorderTraversal(root.Right) // 递归遍历右子树fmt.Println(root.Val)          // 访问根节点}
}

2、迭代遍历

// 后序遍历:左 -> 右 -> 根(迭代实现)
func postorderTraversal(root *TreeNode) {if root == nil {return}// 栈存放的全是 *TreeNodes1 := shard.NewStackArray[*TreeNode]()s1.Push(root)s2 := shard.NewStackArray[*TreeNode]()for !s1.IsEmpty() {node, _ := s1.Pop()s2.Push(node)if node.Left != nil {s1.Push(node.Left)}if node.Right != nil {s1.Push(node.Right)}}for !s2.IsEmpty() {node, _ := s2.Pop()fmt.Println(node.Val)}
}

二、广度优先遍历

1、层序遍历

// 层序遍历
func postorderTraversal(root *TreeNode) {if root == nil {return}q := shard.NewQueueArray[*TreeNode]()q.Enqueue(root)for !q.IsEmpty() {node, _ := q.Dequeue()fmt.Print(node.Val, " ")if node.Left != nil {q.Enqueue(node.Left)}if node.Right != nil {q.Enqueue(node.Right)}}
}

三、shard库介绍

GitHub链接:https://github.com/xzhHas/shard

shard库获取:

go get -u github.com/xzhHas/shard@latest

关于使用Golang写一个数据结构的库,目前只支持栈、队列、堆。

在这里插入图片描述

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

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

相关文章

【鸿蒙开发】第十三章 ArkTS基础类库-容器(数据结构)

目录 1 容器简述 2 线性容器 2.1 ArrayList 2.2 Vector 2.3 List 2.4 LinkedList 2.5 Deque 2.6 Queue 2.7 Stack 2.8 线性容器的使用 3 非线性容器 3.1 HashMap 3.2 HashSet 3.3 TreeMap 3.4 TreeSet 3.5 LightWeightMap 3.6 LightWeightSet 3.7 PlainArray…

3D电子商务是什么?如何利用3D技术提升销售转化?

在数字化浪潮席卷全球的今天,网上购物已成为消费者日常生活中不可或缺的一部分。然而,尽管其便捷性无可比拟,但传统电商模式中的“看不见、摸不着”问题始终困扰着消费者与商家。商品是否符合期望、尺寸是否合适、颜色是否真实……这些不确定…

腾讯地图GL JS点标识监听:无dragend事件的经纬度获取方案

引入腾讯地图SDK <!--腾讯地图 API--><script charset"utf-8" src"https://map.qq.com/api/gljs?librariestools&v1.exp&key***"></script>构建地图容器 <div class"layui-card"><div class"layui-car…

基于SpringBoot+RabbitMQ完成应⽤通信

前言&#xff1a; 经过上面俩章学习&#xff0c;我们已经知道Rabbit的使用方式RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 RabbitMQ的工作队列在Spring Boot中实现&#xff08;详解常⽤的⼯作模式&#xff09;-CSDN博客作为⼀个消息队列,RabbitMQ也可以⽤作应⽤程…

3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)

3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用) 文章目录 3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)前言1. Spring Cloud Eureka 的概述1.1 服务治理概述1.2 服务注册与发现 2. 实践&#xff1a;创建单机 Eureka Server 注册中心2.1 需求说明 图解…

2024年11月第2个交易周收盘总结

计划自己的交易&#xff0c;交易自己的计划! 跟随市场而情绪波动&#xff0c;最终一定会导向失败&#xff01;连续、平稳、冷静地惯彻交易计划&#xff0c;比什么都重要&#xff01; 交易本身是极其简单和清楚的&#xff0c;让事情变复杂的原因不是行情走势和交易本身&#x…

一种时间戳对齐的方法(离线)

这段代码的主要功能是: 读取指定目录下的 pcd 文件和 jpg 文件。对于每个 pcd 文件,在 jpg 目录中找到时间戳最接近的 jpg 文件。将找到的 jpg 文件复制到对应的输出目录,实现时间戳对齐。 这种时间戳对齐的操作在多传感器数据融合中非常常见,它确保了不同传感器采集的数据在时…

【数据分享】全国农产品成本收益资料汇编(1953-2024)

数据介绍 一、《全国农产品成本收益资料汇编 2024》收录了我国2023年主要农产品生产成本和收益资料及 2018年以来六年的成本收益简明数据。其中全国性数据均未包括香港、澳门特别行政区和台湾省数据。 二、本汇编共分七个部分,即:第一部分,综合;第二部分,各地区粮食、油料;第…

SQL 处理数列

在关系模型的数据结构中&#xff0c;并没有“顺序”这一概念。因此&#xff0c;基于它实现的关系数据库中的表和视图的行和列也必然没有顺序。 1 处理数列 1.1 实践 1.1.1 生成连续编号 图 t_num 数据库源与目标视图v_seq 需求&#xff1a;根据0~9 这10个数&#xff0c;生成…

【云原生系列--Longhorn的部署】

Longhorn部署手册 1.部署longhorn longhorn架构图&#xff1a; 1.1部署环境要求 kubernetes版本要大于v1.21 每个节点都必须装open-iscsi &#xff0c;Longhorn依赖于 iscsiadm主机为 Kubernetes 提供持久卷。 apt-get install -y open-iscsiRWX 支持要求每个节点都安装 N…

编写情绪K线指标(附带源码下载)

编写需求&#xff1a; 很多交易者抱怨&#xff0c;传统的跟踪类指标常常存在滞后的问题&#xff0c;而预测类指标又常常不够可靠。那么&#xff0c;是否存在一种指标&#xff0c;能够精准地反映当前K线的强弱变化&#xff0c;并且具备高度的时效性呢&#xff1f; 效果展示&am…

16、pxe自动装机

pxe自动装机的组成 pxe&#xff1a;自动安装系统必要的运行环境 无人值守&#xff1a;为系统定制化的安装需要的软件 pxe的优点 规模化&#xff1a;同时装配多台服务器&#xff08;20-30&#xff09; 自动化&#xff1a;系统安装和服务配置不需要人工干预 远程实现&#x…

H.265流媒体播放器EasyPlayer.js网页直播/点播播放器WebGL: CONTEXT_LOST_WEBGL错误引发的原因

EasyPlayer无插件直播流媒体音视频播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 EasyPlayer.js能够同时支持HTTP、HTTP-FLV、HLS&a…

Javaweb开发核⼼心之玩转Servlet4(笔记)

javaweb开发核⼼心之玩转Servlet4.0 简介&#xff1a;什么是Servlet-开发你的第⼀一个动态⽹网站 什么是Servlet 简介&#xff1a;是JavaServlet的简称&#xff0c;⽤用Java编写的运⾏行行在Web服务器器或应⽤用服务器器上的程序,具有独⽴立于平台和协议的特性, 主要功能在于交…

VUE实现通话:边录边转发送语言消息、 播放pcm 音频

文章目录 引言I 音频协议音频格式:音频协议:II 实现协议创建ws对象初始化边录边转发送语言消息 setupPCM按下通话按钮时开始讲话,松开后停止讲话播放pcm 音频III 第三库recorderplayer调试引言 需求:电台通讯网(电台远程遥控软件-超短波)该系统通过网络、超短波终端等无线…

无人机遥控器基础讲解——CKESC电调小课堂08

无人机遥控器是控制无人机飞行的重要设备&#xff0c;以下是对其的详细介绍&#xff1a; CKESC-专业级电调研发生产供应商http://www.ckesc.com 一、外观与布局 1. 通常由两个摇杆、多个功能按钮、一个显示屏和天线组成。 2. 摇杆一般位于遥控器的中央位置&#xff0c;用于控…

谷歌新作:Unbounded开放世界RPG,AI定义无限游戏新纪元

在开放世界和角色扮演游戏的领域里&#xff0c;玩家们总是渴望着那种无拘无束的自由体验。他们梦想着一个没有空气墙阻隔&#xff0c;没有剧情杀限制&#xff0c;没有任何交互限制的游戏世界。现在&#xff0c;这个梦想可能即将成真。谷歌联合北卡罗来纳大学教堂山分校推出的Un…

Qt文件目录操作

文件目录操作相关类 Qt 为文件和目录操作提供了一些类&#xff0c;利用这些类可以方便地实现一些操作。Qt 提供的与文件和目录操作相关的类包括以下几个&#xff1a; QCoreApplication&#xff1a;用于提取应用程序路径&#xff0c;程序名等文件信息&#xff1b;QFile&#x…

网页web无插件播放器EasyPlayer.js H.265流媒体播放器的decoder.js报Unexpected token ‘<‘错误

EasyPlayer.js H.265流媒体播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff1b;支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#xff…

渗透测试之信息收集 DNS主机发现探测方式NetBIOS 协议发现主机 以及相关PorCheck scanline工具的使用哟

目录 主机发现 利用NetBIOS 协议发现主机 利用TCP/UDP发现主机 PorCheck scanline 利用DNS协议发现主机 主机发现 信息收集中的一项重要工作是发现内网中的主机、数据库、IP段网络设备、安全设备等资产&#xff0c;以便于更快地获取更多权限和密码&#xff0c;更加接近红…