脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - 利用go语言实现查找二叉树中的最大宽度

利用go语言实现查找二叉树中的最大宽度

2022-10-09 13:17​呆呆灿 Golang

这篇文章主要介绍了利用go语言实现查找二叉树中的最大宽度,文章围绕主题展开详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下

介绍

这道题是这样的,有一个二叉树,让求出这颗Bt树里面最大的宽度是有几个节点,同时还要求出最大宽度的这些节点在第几层?

比如:下面这颗树,它每层最大的宽度是3,所在的层数是在第3层

利用go语言实现查找二叉树中的最大宽度

流程

  • 这个题主要是使用队列的方式来存储需要遍历的节点
  • 同时还需要几个变量来存储最大的宽度(maxWidth)、每层有几个节点(count)、最大宽度所在的层(maxInrow)、当前层最后一个节点(currentRowEndNode)、下一层最后一个节点(nextRowEndNode)
  • 程序的一开始,便将二叉树的头节点加入到队列里面,同时将这个节点赋值给下一层最后一个节点因当根节点只有一个节点,同时也将当前行的最后一个节点赋值为这个节点
  • 通过循环来对这个队列进行遍历,当进入循环后就认为走到了一个节点,count就要加1
  • 将队列里面的节点元素开始弹出,如果它的子节点存在就将子节点赋值给nextRowEndNode,先赋值左再赋值右(因为先处理的是左子节点),同时将这俩个节点加入到队列里面(如果它们存在的话)
  • 还要对当前的节点进行一个判断,判断当前的节点是不是到了当前行的最后一个节点,如果是的话,就代表当前行的数据已经处理完成,就要把nextRowEndNode赋值给currentRowEndNode,count置0
  • 进行下一波循环

代码

二叉树结构体

?
1
2
3
4
5
type TreeNode struct {
    val   string
    left  *TreeNode
    right *TreeNode
}

测试代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func main() {
    sNode := &TreeNode{val: "1"}
    sNode.left = &TreeNode{val: "2"}
    sNode.right = &TreeNode{val: "3"}
    sNode.left.left = &TreeNode{val: "4"}
    sNode.left.right = &TreeNode{val: "5"}
    sNode.right.left = &TreeNode{val: "6"}
    sNode.left.left.left = &TreeNode{val: "7"}
    sNode.left.left.right = &TreeNode{val: "8"}
    sNode.left.right.left = &TreeNode{val: "9"}
    sNode.left.right.right = &TreeNode{val: "10"}
    sNode.right.left.left = &TreeNode{val: "11"}
    maxW, row := findBtMaxWidth(sNode)
    fmt.Printf("最大宽度: %v;在第 %v层", maxW, row)
}

查找二叉树最大宽度的代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
func findBtMaxWidth(bt *TreeNode) (maxWidth int, maxInrow int) {
    row := 0
    //临时保存节点的队列
    var tempSaveNodeQueue []*TreeNode
    //保存宽度
    count := 1
    var currentRowEndNode *TreeNode
    var nextRowEndNode *TreeNode
    if bt != nil {
        nextRowEndNode = bt
        currentRowEndNode = nextRowEndNode
        tempSaveNodeQueue = append(tempSaveNodeQueue, bt)
    }
    for len(tempSaveNodeQueue) != 0 {
        count++
        treeNode := tempSaveNodeQueue[0]
        tempSaveNodeQueue = tempSaveNodeQueue[1:]
 
        if treeNode.left != nil {
            nextRowEndNode = treeNode.left
            tempSaveNodeQueue = append(tempSaveNodeQueue, treeNode.left)
        }
 
        if treeNode.right != nil {
            nextRowEndNode = treeNode.right
            tempSaveNodeQueue = append(tempSaveNodeQueue, treeNode.right)
        }
        if currentRowEndNode == treeNode {
            row++
            currentRowEndNode = nextRowEndNode
            if maxWidth < count {
                maxInrow = row
                maxWidth = count
            }
            count = 0
        }
    }
    return
}

代码解读

这里面的代码大部分的逻辑还是很简单的,

说一下在if判断里面的代码叭,为啥要分别将子节点的leftright分别赋值给nextRowEndNode呢?

因为在一个子节点下面的left和right并不是全都存在的,有的时候会是个空,所以这里要分别赋值

if currentRowEndNode == treeNode:这一个判断里面,因为如果进入到了这个判断里面就说明到了当前层的最后一个节点了,所以就要把下一层的最后一个节点赋值给当前层的最后一个节点;

因为还有一个要找出最大宽度的一个功能,所以这个maxWidth要和coutn做一个比较如果maxWidth比较小的话就将count赋值给maxWidth,同时将当前的层数赋值给maxInrow;

row:而row在这里面所充当的角色是当前是完成第几行的操作

为啥这里要定义一个currentRowEndNode和nextRowEndNode?

这种的写法按层来处理,当获取到一个节点的时候,这时我就要拿到他们的子节点,如果现在不获取子节点的话在后面是没有办法获取的,当这一行结束的时候将nextRowEndNode赋值给currentRowEndNode,接下来nextRowEndNode再找下一层的最后一个节点。

利用go语言实现查找二叉树中的最大宽度

到此这篇关于利用go语言实现查找二叉树中的最大宽度的文章就介绍到这了,更多相关go查找二叉树内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/6981023626619437070

延伸 · 阅读

精彩推荐
  • Golanggolang新手们容易犯的3个错误总结

    golang新手们容易犯的3个错误总结

    这篇文章主要给大家介绍了关于golang新手们容易犯的3个错误,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    西二旗搬砖仔1882020-05-17
  • GolangGo语言同步等待组sync.WaitGroup结构体对象方法详解

    Go语言同步等待组sync.WaitGroup结构体对象方法详解

    这篇文章主要为大家介绍了Go语言同步等待组sync.WaitGroup结构体对象方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升...

    陈博士10292022-08-26
  • GolangGo1.18 泛型的好、坏亦或丑?

    Go1.18 泛型的好、坏亦或丑?

    Go 泛型定了,有哪些好的使用场景,哪些不好的应用场景,亦或哪些使用看起来丑?本文聊聊这个问题。...

    幽鬼6782021-12-29
  • Golang详解Go语言运用广度优先搜索走迷宫

    详解Go语言运用广度优先搜索走迷宫

    广度优先搜索是从图中的某一顶点出发,遍历每一个顶点时,依次遍历其所有的邻接点,再从这些邻接点出发,依次访问它们的邻接点,直到图中所有被访...

    盛开的太阳9592021-08-11
  • GolangGo语言学习教程之声明语法(译)

    Go语言学习教程之声明语法(译)

    Golang 就是类C的语法,下面这篇文章主要给大家介绍了关于Go语言学习教程之声明语法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考...

    Rob Pike3702020-05-12
  • Golang详解Golang实现http重定向https的方式

    详解Golang实现http重定向https的方式

    这篇文章主要介绍了详解Golang实现http重定向https的方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    andy zhang3552020-05-18
  • GolangGo语言 go程释放操作(退出/销毁)

    Go语言 go程释放操作(退出/销毁)

    这篇文章主要介绍了Go语言 go程释放操作(退出/销毁),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    cqu_jiangzhou10872021-06-11
  • GolangGo语言中如何确保Cookie数据的安全传输

    Go语言中如何确保Cookie数据的安全传输

    这篇文章主要介绍了Go语言中如何确保Cookie数据的安全传输,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    Kevin3752020-06-07