Go语言中文网 为您找到相关结果 141

golang 系列教程(四)—— 高级数据结构

背景 golang 不像c++,已经有stl这种通用的高级数据结构。所以如果想要栈,队列,链表等数据结构需要自己实现。 下面介绍下常用的几种数据结构 链表 单链表是一种链式存取的数据结构,一个链表由一个或者多个节点组成,每个节点有一个指针指向下一个节点。 以下是一个节点为int的链表实现。 package list type List struct { Head * ListNode length int } type ListNode struct { Next *ListNode Data int } func (p *List) AddNode(data int) { if p.Head == nil { p.Head = new(ListNode) } var node = &Lis...阅读全文

博文 2019-08-18 00:04:24 叶不闻

二叉查找数 golang实现

首先定义数据结构,这个不用多说,这里添加了一个size,这样就可以在o(1)的时间复杂度内获取这个二叉树的大小。 image.png 首先要写的是添加节点(put)接口:通过和当前节点的key比较,如果相等就更新val,如果小于就遍历左节点,反之则遍历右节点。 image.png 如果没有找到就创建一个新节点: image.png 然后是 get接口,这个接口也比较简单,和put类似,左右遍历即可: image.png 个人认为二叉查找数最大的难点是删除一个树节点 有4种情况: 1,待删除节点的左右节点都为null,直接返回null 2,待删除节点的左节点为null,直接返回右节点 3,待删除节点的右节点为null,直接返回左节点 4,待删除节点的左右节点都不为null, 一种普遍的做法是用...阅读全文

博文 2018-10-18 00:34:44 Tibbersshao

根据输入构建完全二叉树, 并找出根到节点和为给定值的所有路径

package main import ( "fmt" "strings" "strconv" ) type Node struct { Data int Left *Node Right *Node High int } func main() { // 根据输入构建完全二叉树, 并找出根到节点和为给定值的所有路径 // 输入 // 22 // 10,5,12,4,7 // 输出 // 10,5,7 // 10,12 // // 使用栈对树进行深度优先遍历,利用树高更方便寻找判断路径 paths, err := findPath(22, "10,5,12,4,7") fmt.Println(paths, err) } // 查找路径 func findPath(sum int, nodeV...阅读全文

C++服务端面试准备(3)数据结构与算法相关

声明:本文内容纯属博主自己查找和归纳的个人所需的知识点,仅作参考,如有错误,博主强烈希望您指出。如果您是某个知识点的原创博主,如有需要,可联系本人加上链接。本文内容会根据博主所需进行更新,希望大家多多关照。 你所知道的数据结构 数组 (Array)、栈 (Stack)、队列 (Queue)、链表 (Linked List) 树: 堆(heap)、(B-树、B+树、)二叉查找树、AVL树、红黑树、二叉树、哈夫曼树 图 (Graph) 散列表 (Hash) 数组:有序的元素序列,固定大小 栈:是一种运算受限的线性表,先进后出 队列:一种操作受限制的线性表,先进先出 链表:非连续、非顺序的存储结构,逻辑顺序是通过链表中的指针实现的 1.头插法:新插入的数据的指针指向最后的数据 2.尾插法:最后的数...阅读全文

博文 2020-04-08 10:32:46 DX3906

Golang——运算符和格式化输出

运算符 算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、其他运算符 算术运算符 + 相加 - 相减 * 相乘 / 相除 % 求余 ++ 自增 -- 自减 func main(){ a := 2 b := 7 fmt.Println(a + b) //9 fmt.Println(a - b) //-5 fmt.Println(a * b) //14 fmt.Println(a / b) //0 fmt.Println(a % b) //2 a ++ fmt.Println(a) //3 b -- fmt.Println(b) //6 } 注意:由于Go语言没有自动类型转换,因此运算必须是同一种类型,否则编译出错 invalid operation: a + b (mismatched...阅读全文

博文 2020-05-14 08:32:44 Cici冬雪

golang 容器数据类型

container 包实现了三个复杂的数据结构:堆,链表,环(heap、list 和 ring)。当我们需要使用这些数据结构时可以直接使用而不必自己去实现一遍相关算法。 1. 堆 堆使用的数据结构是最小二叉树,即根节点比左边子树和右边子树的所有值都小。 go的堆包只是实现了一个接口,看下它的定义: type Interface interface { sort.Interface Push(x interface{}) // add x as element Len() Pop() interface{} // remove and return element Len() - 1. } 可以看出,这个堆组合了 sort 包的 sort.Interface, 回顾下 sort.Interfa...阅读全文

GoLang基础语法

变量定义 从hello world入手 package main import "fmt" func main() { fmt.Println("Hello World") } 控制台输出: Hello World 变量默认值 package main import "fmt" func main() { var a int var s string fmt.Println(a, s) } 控制台输出: 0 注:s为"",故打印出来没有效果 如果想让""字符串显示,则代码如下: package main import "fmt" func main() { var a int var s string fmt.Println(a, s) fmt.Printf("%d %q\n", a, s)...阅读全文

博文 2018-09-25 11:34:56 等她下班

golang实现堆排序

算法题: 给定一个整型数组,将数组的中的元素按升序排序。 基本思路: 操作:排序 输入:无序整型数组 输出:有序整型数组 这里操作采用堆排序算法,堆排序的基本步骤如下: 将整型数组构造成大顶堆结构 返回堆顶元素 减少堆的长度,有如下情形: a. 若堆的长度等于0,跳转到第4步 b. 若堆的长度大于0,跳转到第2步 返回有序数组 堆排序算法有个关键步骤是构建堆的过程,堆的定义如下: 堆是一个满二叉树,根元素的值大于左右子树所有节点的值,并且左右子树也是一个堆 从堆的定义可以看出,堆的定义是一个递归定义,针对这种递归定义的数据结构,往往会涉及到递归算法。 对于树的构造,一般性的有两种方式,一种是自上而下,另一种是自下而上,至于采用那种方式方便,要依据具体的情况。堆的构造过程是自下而上的方式。这种...阅读全文

博文 2019-03-29 06:34:40 IT孤独者

go版本的排序二叉树,充足的api和注释说明

排序二叉树的介绍不多说了,本文的二叉树具有如下开放接口中的全部功能。 ```go package BTree type BTreeI interface { //if a bt contains data Contain(data interface{}) (bool, error) //get the node which has max data FindMax() (*BinaryNode, error) //get the node which has min data FindMin() (*BinaryNode, error) //insert a data Insert(x interface{}) (*BinaryNode, error) //delete a node wh...阅读全文

进制知识

进制 对于整数,有四种表示方式: 1、二进制:0,1 ,满 2 进 1。在 golang 中,不能直接使用二进制来表示一个整数,它沿用了 c 的特点。 2、十进制:0-9 ,满 10 进 1。 3、 八进制:0-7 ,满 8 进 1。 以数字 0 开头表示。 4、 十六进制:0-9及A-F,满16进1.。以0x或0X开头表示。 此处的 A-F不区分大小写...阅读全文

博文 2019-02-11 21:34:43 StevenQin

堆排序

堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。且完全二叉树可以基于数组存储(父子节点的关系可以用数组下标表示),加持上堆的特性,故可以做堆排序。 满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树;即每一层节点数都达到最大值;即深度为 k 的二叉树节点个数为 2^k-1,则为满二叉树。 完全二叉树:若设二叉树的深度为 k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,且第 k 层所有的结点都连续集中在最左边,这就是完全二叉树。 堆:基于完全二叉树,分为大顶堆/小顶堆。各节点的数值皆大于其左右子节点的数值(大顶堆),或各节点的数值皆小于其左右子...阅读全文

博文 2019-02-28 12:34:39 big_cat

按之字形顺序打印二叉树

题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 示例: 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ [3], [9,20], [15,7] ] 思路 1.思路与102.树的层次遍历相似,只不过需要隔层翻转。 2.可以设置一个翻转标识位flag,当falg == true时,进行头插法,这样便实现了翻转。 Java代码实现 public List> zigzagLevelOrder(TreeNode root) { List> res = new ArrayLis...阅读全文

博文 2020-03-20 13:32:50 youzhihua

Go基础系列:struct和嵌套struct

struct struct定义结构,结构由字段(field)组成,每个field都有所属数据类型,在一个struct中,每个字段名都必须唯一。 说白了就是拿来存储数据的,只不过可自定义化的程度很高,用法很灵活,Go中不少功能依赖于结构,就这样一个角色。 Go中不支持面向对象,面向对象中描述事物的类的重担由struct来挑。比如面向对象中的继承,可以使用组合(composite)来实现:struct中嵌套一个(或多个)类型。面向对象中父类与子类、类与对象的关系是is a的关系,例如Horse is a Animal,Go中的组合则是外部struct与内部struct的关系、struct实例与struct的关系,它们是has a的关系。Go中通过struct的composite,可以"模仿"很多...阅读全文

博文 2018-11-23 09:11:24 f-ck-need-u

二叉树的基本运算2

这一篇是接上一篇文章二叉树的基本运算 二叉树的遍历 二叉树遍历分为三种:前序、中序、后序: 前序遍历:根结点 -> 左子树 -> 右子树 中序遍历:左子树 -> 根结点 -> 右子树 后序遍历:左子树 -> 右子树 -> 根结点 另外还有一种层次遍历,即每一层都从左向右遍历。譬如,对于下面的二叉树 前序遍历:abdefgc中序遍历:debgfac后序遍历:edgfbca层次遍历:abcdfeg 实现方法 因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点 中序遍历 go实现 // 中序遍历,用栈实现 f...阅读全文

博文 2019-02-13 14:34:44 Salamander

【Golang 基础】Go 语言的操作符

Go 语言的运算符 算术运算符 +:相加; -:相减; *:相乘; /:相除; %:求余; ++:自增; --:自减; 其中,++ 与 -- 不能用于赋值表达式, 如: count2 := count++;并且在 Go 语言中,不存在如:++count 表达式。 关系运算符 ==:检查两个值是否相等,如果相等返回 true,否则返回 false; !=:检查两个值是否不相等,如果不相等返回 true,否则返回 false; >:检查左边值是否大于右边值,如果是返回 true,否则返回 false; <:检查左边值是否小于右边值,如果是返回 true,否则返回 false; >=:检查左边值是否大于等于右边值,如果是返回 true,否则返回 false; <=:检查左边值是否小于等于右边值,如...阅读全文

博文 2019-03-18 19:34:42 龙泷VK

2019-01-20

最小堆和最大堆 golang实现 二叉堆是一种特殊的堆,它满足两个性质:结构性和堆序性 结构性:二叉堆是一颗完全二叉树,完全二叉树可以用一个数组表示,不需要指针,所以效率更高。当用数组表示时,数组中任一位置i上的元素,其左儿子在位置2i上,右儿子在位置(2i+ 1)上,其父节点在位置(i/2)上。 堆序性质:堆的最小值或最大值在根节点上,所以可以快速找到最大值或最小值。 最大堆和最小堆是二叉堆的两种形式。 -最大堆:根结点的键值是所有堆结点键值中最大者的堆。 -最小堆:根结点的键值是所有堆结点键值中最小者的堆。 1. 最小堆实现,不使用container/heap type MinHeap struct { Element []int } 定义构造方法 数组中第一个元素不使用,存放一个小于堆...阅读全文

博文 2019-01-20 18:34:44 一线曙光_

【Golang 基础】Go 语言 面向对象

Go 语言的面向对象   Go 语言的面向对象非常简单,仅支持封装,不支持继承和多态。继承和多态是在接口中实现的。   因此 Go 语言中没有 class,而是通过 struct(结构体) 对相同类型或不同类型的数据进行封装。 通过 type struct {} 格式定义结构体; type User struct { Name string Age int IsActive bool } 定义后的结构体就可以作为类型使用; hvkcoder := User{Name: "hvkcoder", Age: 18, IsActive: true} fmt.Println(hvkcoder) // {hvkcoder 18 true} 或 hvkcoder := User{...阅读全文

博文 2019-03-30 02:34:40 爱写作的程序猿

Golang笔记之 从helloworld.go来观察go的工具链(简单向)

我并不打算在这个时间点来把所有的go语言的工具链讲的一清二楚。而是通过我们的Hello World案例来讲解这个程序是如何编译并运行的。 package main import "fmt" func main(){ fmt.Println("Hello World") } 两个命令: go run ****.go 2.go build ****.go 当我们执行第一个命令的时候,他的作用仅仅会输出我们所期望的结果。但是不会产生一个可以复用的程序。当运行go build的时候,会产生一个二进制文件,可以直接执行。 命令 catdeMBP:go cat$ go build catdeMBP:go cat$ ls go main.go catdeMBP:go cat$ ./go Hello Wor...阅读全文

博文 2019-06-14 23:32:43 我加入简书的路程

入门:基础语法(四)循环

#### golang只有for循环,和其他语言一样,那我们直接进行一个简单的程序演示:将任意给定的一个数字转换成二进制。 **算法分析:任意给定一个数,eg:12,然后一直用12/2,12/2=6...0 6/2=3...0 3/2=1...1 1/2=0..1,然后把余数从最后一个往前记录,即可获得给定数的二进制数字,暨12的二进制数是1100** 那么我们用一个循环来控制给定的数字n/2以及n%2,我们这里的递增条件是n/2,并把值再赋给n,结束条件是n>0(当然不能等于0如果等于0的话就会多执行一次循环体),我们所需要的是n%2的值,那么我们每次循环就计算并记录一次n%2,然后把这个值从后往前记录下来即可: ``` func convert2Bin(n int) (result st...阅读全文

博文 2018-09-27 00:53:53 ace_kylin

golang leetcode 1103. 二叉树寻路

思路: 通过当前label计算父节点 题目限制 1 <= label <= 10^6 完全二叉树每一层的节点和节点开始数字为: 1 2 4 8 16 32 ... 所以每一层的数为 []int{1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576} 提前计算每一层的数量。 遍历找到当前lablel所在的层。当前层最后一个节点为 last - 1。因为这个二叉树是蛇形走位。所以 上层节点所在对应层的偏移是 (last - 1 - label)/2 计算上一层的起始位置为last/4。 上一层label即为 (last ...阅读全文

博文 2019-07-03 13:32:41 Tibbersshao

2019-05-23 Go语言学习四 并发

一、Go程 Go 程(goroutine)是由 Go 运行时管理的轻量级线程。 go f(x, y, z) 会启动一个新的 Go 程并执行 f(x, y, z) f, x, y 和 z 的求值发生在当前的 Go 程中,而 f 的执行发生在新的 Go 程中。 Go 程在相同的地址空间中运行,因此在访问共享的内存时必须进行同步。sync 包提供了这种能力,不过在 Go 中并不经常用到,因为还有其它的办法(见下一页)。 package main import ( "fmt" "time" ) func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func...阅读全文

博文 2019-05-24 03:34:40 橙小花一直相信

GoLang 学习笔记 - 运算符

运算符用于在程序运行时执行数学或逻辑运算。 Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 算术运算符 下表列出了所有Go语言的算术运算符。假定 A 值为 15,B 值为 5 。 运算符 描述 实例 + 相加 A + B 输出结果 20 - 相减 A - B 输出结果 10 * 相乘 A * B 输出结果 75 / 相除 B / A 输出结果 3 % 求余 B % A 输出结果 0 ++ 自增 A++ 输出结果 16 -- 自减 A-- 输出结果 14 GoLang 中 ++ 和 -- 操作只可以当成一个语句来使用,不可以作为表达式。这样可以避免很多问题。 a ++ //允许 b = a++ //不允许 即便如此,自增和自减仍然是一种很不规范...阅读全文

博文 2019-07-20 21:32:37 凉丶心园

小结

在计算机中最小的信息单位是bit,也就是一个二进制位,8个bit组成一个Byte,也就是字节。一个存储单元(一个地址),可以存储一个字节,也就是8个二进制位。计算机的存储器容量是以字节为最小单位来计算的,对于一个有128个存储单元的存储器,可以说它的容量为128字节。 地址总线,是用来传输数据所在地址的,而32位系统一般有32根地址总线,那么所能传输的最大数据地址就是2^32,这里所指的地址是真实的数据地址,即物理地址。用户在使用计算机时能够访问的最大内存不单是由CPU地址总线的位数决定的,还需要考虑操作系统的实现。实际上用户在使用计算机时,进程访问到的地址都是逻辑地址,并不是真实的物理地址,逻辑地址是由操作系统提供的,并维护了逻辑地址和物理地址的映射。对于32位的windows操作系统,提...阅读全文

博文 2018-12-05 21:34:45 越塔打哭你

Golang筑基 ——运算符

golang的运算符同C/C++一样,共有如下几种 算术运算符 下表列出了所有Go语言的算术运算符。假定 A 值为 10,B 值为 20。 图片.png 注意: 自增(++)和自减(--)不同于C/C++,a++和++a在golang中是没有区别的,同理,a--和--a也是如此。我觉得这也是golang方便之处,去除一些没必要功能设计,让语言本身更便捷。 关系运算符 下表列出了所有Go语言的关系运算符。假定 A 值为 10,B 值为 20。 图片.png 逻辑运算符 下表列出了所有Go语言的逻辑运算符。假定 A 值为 True,B 值为 False。 图片.png 位运算符 位运算符对整数在内存中的二进制位进行操作。 下表列出了位运算符 &, |, 和 ^ 的计算: 图片.png 赋值运算符...阅读全文

博文 2020-04-13 21:32:49 技术修仙

5.2.5Golang的运算符

目录:https://www.jianshu.com/p/e406a9bc93a9 运算符 golang的运算符有五种: 1.算术运算符 2.比较运算符 3.逻辑运算符 4.位运算符 5.赋值运算符 算术运算符 运算符 描述 + 相加 - 相减 * 相乘 / 相除 % 求余 例子: var ( a = 5 b = 2 ) // 算术运算符 fmt.Println("a + b:",a + b) fmt.Println("a - b:",a - b) fmt.Println("a * b:",a * b) fmt.Println("a / b:",a / b) fmt.Println("a % b:",a % b) a ++ // go语言中的 ++ -- 是一个单独的语句 fmt.Print...阅读全文

博文 2020-03-16 17:32:56 寒暄_HX

variable-precision SWAR算法

目的:计算uint32_t二进制数中1的数量算法实现: uint32_t swar(uint32_t i){ // step 1: 计算出的值i的二进制表示可以按每两个二进制为一组进行分组 // ,各组的二进制表示该组中1的个数 i = (i & 0x55555555) + ((i >> 1) & 0x55555555); // step 2:计算出的值i的二进制表示可以按每四个二进制为一组进行分组 // ,各组的二进制表示该组中1的个数 i = (i & 0x33333333) + ((i >> 2) & 0x33333333); // step 3:计算出的值i的二进制表示可以按每八个二进制为一组进行分组 // ,各组的二进制表示该组中1的个数 i = (i & 0xOFOFOFOF) ...阅读全文

博文 2020-01-09 14:28:33 lobo

Golang解LeetCode 617. 合并二叉树

617. 合并二叉树 题目描述 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。 示例 1: 输入: Tree 1 Tree 2 1 2 / \ / \ 3 2 1 3 / \ \ 5 4 7 输出: 合并后的树: 3 / 4 5 / \ \ 5 4 7 注意: 合并必须从两个树的根节点开始。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/merge-two-binary-trees 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请...阅读全文

博文 2019-12-11 06:32:43 肥肥的大肥鹅

437.路径总和III

题目描述 给定一个二叉树,它的每个结点都存放着一个整数值。 找出路径和等于给定数值的路径总数。 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。 二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。 示例 root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8 10 / \ 5 -3 / \ \ 3 2 11 / \ \ 3 -2 1 返回 3。和等于 8 的路径有: 1. 5 -> 3 2. 5 -> 2 -> 1 3. -3 -> 11 思路 既然题目中说明不超过1000个结点,可以使用一个长度为1000的数组,用于保存所有结点的值。 2.可以抽象理解为v...阅读全文

博文 2020-01-11 14:32:42 youzhihua

6.运算符

Go语言基础之运算符 | Golang 运算符用于在程序运行时执行数学或逻辑运算。 运算符 Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 算数运算符 运算符 描述 + 相加 - 相减 * 相乘 / 相除 % 求余 注意: ++(自增)和--(自减)在Go语言中是单独的语句,并不是运算符。 关系运算符 运算符 描述 == 检查两个值是否相等,如果相等返回 True 否则返回 False。 != 检查两个值是否不相等,如果不相等返回 True 否则返回 False。 > 检查左边值是否大于右边值,如果是返回 True 否则返回 False。 >= 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。 < 检查左边值是否小于右边值,如果...阅读全文

博文 2020-04-05 13:32:48 雪上霜

PHP进制转换

进制四种二进制:0,1 ,满 2 进 1。在 golang 中,不能直接使用二进制来表示一个整数,它沿用了 c 的特点。十进制:0-9 ,满 10 进 1。八进制:0-7 ,满 8 进 1. 以数字 0 开头表示。十六进制:0-9 及 A-F,满 16 进 1. 以 0x 或 0X 开头表示。此处的 A-F 不区分大小写。 package main import "fmt" func main() { vari int = 5 //二进制 fmt.Printf("%b \n",i) varj int = 011 // 011=>8+1 = 9 //八进制 fmt.Println("j=",j) vark int = 0x11 //0x11 => 16+1 =17 //十六进制 0x或者0X开...阅读全文

博文 2019-08-23 15:32:54 MO_ON_e503

树的子结构

题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 思路 1.递归比较两个数的结构。 2.比较A树和B树当前的结点,若A树和B树的值相等,则继续比较它们的左右子树;若不相等,则拿A树的左子树和右子树进行同样的过程。 3.当B树遍历到了空结点,说明B是A的子结构;否则不是A的子结构。 Java代码实现 public boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root1 == null || root2 == null){ return false; } boolean flag = judge(root1,root2); if(!flag){ flag = HasSubtree...阅读全文

博文 2020-01-09 01:32:43 youzhihua

二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 思路 使用递归算法求解。 如果传入的结点不为null,则将其左右孩子进行交换,然后递归处理其左右孩子即可。 Java代码实现 public class Solution { public void Mirror(TreeNode root) { if(root != null){ TreeNode temp = root.left; root.left = root.right; root.right = temp; Mirror(root.left); Mirror(root...阅读全文

博文 2020-01-13 13:32:45 youzhihua

leetcode_889

Golang: 思路:因为前序和后序是没有办法构建一个唯一的二叉树序列的,所以需要在某些方面自定规则,比如[1,2],[2,1],这里将这种序列定义为一个左子树 代码如下: func constructFromPrePost(pre []int, post []int) *TreeNode { node:=&TreeNode{Val: pre[0]} //长度至少要大于1才能构建子树 if len(pre)>1{ i:=0 for i阅读全文

博文 2020-04-11 13:32:42 淳属虚构

Go字符串初探

这篇博文的知识,主要是阅读了Go的官方博客在2013年发表的一篇,名为《Strings, bytes, runes and characters in Go》的文章,里面解释了Go语言中的string、byte以及rune类型以及Go中的编码方式等内容。 相关概念的辨析 字符串、字符、字节、位: 位bit:bit是计算机中最小的存储单位,一个bit表示一个二进制位,存储0或1。 字节byte:一个byte由8个bit组成。在Go中,byte也是一种类型,其底层实际上是一种uint8类型的别名,主要是为了区分字节类型和uint8类型,可以指代一个ASCII的字符。 字符:字符表示一个可以正常显示的一个符号,譬如一个字符串abc,其中a、b、c都是字符,在Go中,一个字符对应一个rune类型值。...阅读全文

博文 2020-05-02 23:34:50 周小路

687.最长同路径值

题目描述 给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。 注意:两个节点之间的路径长度由它们之间的边数表示。 示例 输入: 5 / \ 4 5 / \ \ 1 1 5 输出: 2 思路 1.可以根据题意推导出本题的公式:rootPathVal = Math.max(leftPathVal,rightPathVal)。 2.可以看出此题可以使用递归思想求解。 3.若leftVal == rootVal,则leftPathVal = leftPathVal + 1,否则leftVal = 0 ,因为只有相同时,leftVal才可以作为同路径的参考;rightVal也是同理。 Java代码实现 class Solution { private...阅读全文

博文 2020-01-11 14:32:42 youzhihua

572. 另一个树的子树

题目描述 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。 示例 给定的树 s: 3 / \ 4 5 / \ 1 2 给定的树 t: 4 / \ 1 2 返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。 思路 1.递归比较两个数的结构。 2.比较A树和B树当前的结点,若A树和B树的值相等,则继续比较它们的左右子树;若不相等,则拿A树的左子树和右子树进行同样的过程。 3.当A树和B树同时遍历到了空结点,说明B是A的子结构;否则不是A的子结构。 Java代码实现 class Solution { public boolean isSubtree(Tr...阅读全文

博文 2020-01-09 01:32:43 youzhihua

数据结构和算法(Golang实现)(24)排序算法-优先队列及堆排序

优先队列及堆排序 堆排序(Heap Sort)由威尔士-加拿大计算机科学家J. W. J. Williams在1964年发明,它利用了二叉堆(A binary heap)的性质实现了排序,并证明了二叉堆数据结构的可用性。同年,美国籍计算机科学家R. W. Floyd在其树排序研究的基础上,发布了一个改进的更好的原地排序的堆排序版本。 堆排序属于选择类排序算法。 一、优先队列 优先队列是一种能完成以下任务的队列:插入一个数值,取出最小或最大的数值(获取数值,并且删除)。 优先队列可以用二叉树来实现,我们称这种结构为二叉堆。 最小堆和最大堆是二叉堆的一种,是一颗完全二叉树(一种平衡树)。 最小堆的性质: 父节点的值都小于左右儿子节点。 这是一个递归的性质。 最大堆的性质: 父节点的值都大于左右儿...阅读全文

博文 2020-04-07 16:32:44 陈星星

leetcode_979

Golang: 思路:二叉树用递归就对了,但是这题我不会!!!思路是对的,但是脑子就是转不过来 代码如下: func distributeCoins(root *TreeNode) int { ans:=[]int{0} dfs979(root,&ans) return ans[0] } func dfs979(root *TreeNode,ans *[]int) int{ if root==nil{ return 0 } L:=dfs979(root.Left,ans) R:=dfs979(root.Right,ans) (*ans)[0]+=abs(L)+abs(R) return root.Val+L+R-1 ...阅读全文

博文 2020-04-20 15:38:59 淳属虚构

leetcode_617

Golang: 思路:二叉树,用递归吧 代码如下: func mergeTrees(t1 *TreeNode, t2 *TreeNode) *TreeNode { if t1==nil&&t2!=nil{ return t2 }else if t1!=nil&&t2==nil{ return t1 }else if t1==nil&&t2==nil{ return nil }else{ return &TreeNode{ Val:t1.Val+t2.Val, Left:mergeTrees(t1.Left,t2.Left), Right:mergeTrees(t1.Right,t2.Right), } } ...阅读全文

博文 2020-04-01 11:33:20 淳属虚构

leetcode_637

Golang: 思路:二叉树,层序遍历即可 代码如下: func averageOfLevels(root *TreeNode) []float64 { var res []float64 if root!=nil{ stack:=[]*TreeNode{root} for len(stack)!=0{ level:=len(stack) num:=0 for i:=0;i阅读全文

博文 2020-04-01 09:33:04 淳属虚构