利用go语言判断是否是完全二叉树

 更新时间:2022年05月17日 11:58:12   作者:​ 呆呆灿   ​  
这篇文章主要介绍了利用go语言判断是否是完全二叉树,当一个节点存在右子节点但是不存在左子节点这颗树视为非完全二叉树,通过利用GO语言判断来判断出否是完全二叉树,详细内容参考如下

一、什么是完全二叉树?

先看如下这一张图:

这个一颗二叉树,如何区分该树是不是完全二叉树呢?

  • 当一个节点存在右子节点但是不存在左子节点这颗树视为非完全二叉树
  • 当一个节点的左子节点存在但是右子节点不存在视为完全二叉树
  • 如果没有子节点,那也是要在左侧开始到右侧依次没有子节点才视为完全二叉树,就像上图2中

而上面第一张图这颗二叉树很明显是一颗非完全二叉树,因为在第三层也就是在节点2它并没有右子节点。在6和4节点中隔开了一个节点(2节点没有右子节点),所以不是完全二叉树

再看第二张图,这颗树就是一个完全二叉树,虽然在这个颗节点3没有右子节点,但是6 4 5节点之间并没有空缺的子节点,这里就解释了上面说的第三条(如何没有子节点,那也是在左侧开始到右侧依次没有子节点才视为完全二叉树)

二、流程

这道题可以使用按层遍历的方式来解决:

  • 首先准备一个队列,按层遍历使用队列是最好的一种解决方法
  • 首先将头节点加入到队列里面(如果头节点为空,你可以认为它是一个非完全二叉树也可以认为它是完全二叉树)
  • 遍历该队列跳出遍历的条件是直到这个队列为空时
  • 这个时候需要准备一个Bool的变量,如果当一个节点的左子节点或者右子节点不存在时将其置成true
  • 当Bool变量为true并且剩余节点的左或右子节点不为空该树就是非完全二叉树
  • 当一树的左子节点不存在并且右子节点存在,该树也是非完全二叉树

三、代码

1.树节点

type TreeNode struct {
	val   string
	left  *TreeNode
	right *TreeNode
}

2.测试代码

func main() {
	root := &TreeNode{val: "1"}
	root.left = &TreeNode{val: "2"}
	root.left.left = &TreeNode{val: "4"}
	root.left.right = &TreeNode{val: "10"}
	root.left.left.left = &TreeNode{val: "7"}
	root.right = &TreeNode{val: "3"}
	root.right.left = &TreeNode{val: "5"}
	root.right.right = &TreeNode{val: "6"}
	if IsCompleteBt(root) {
		fmt.Println("是完全二叉树")
	} else {
		fmt.Println("不是完全二叉树")
	}
}

3.判断树是否为完全二叉树代码

// IsCompleteBt 这里默认根节点为空属于完全二叉树,这个可以自已定义是否为完全二叉树/***/
func IsCompleteBt(root *TreeNode) bool {
	if root == nil {
		return true
	}

	/**
	* 条件:
	* 	1.当一个节点存在右子节点但是不存在左子节点这颗树视为非完全二叉树
	*	2.当一个节点的左子节点存在但是右子节点不存在视为完全二叉树
	 */
	var tempNodeQueue []*TreeNode

	tempNodeQueue = append(tempNodeQueue, root)

	var tempNode *TreeNode
	isSingleNode := false
	for len(tempNodeQueue) != 0 {
		tempNode = tempNodeQueue[0]
		tempNodeQueue = tempNodeQueue[1:]

		if (isSingleNode && (tempNode.left != nil || tempNode.right != nil)) || (tempNode.left == nil && tempNode.right != nil){
			return false
		}

		if tempNode.left != nil{
			tempNodeQueue = append(tempNodeQueue,tempNode.left)
		}else{
			isSingleNode = true
		}

		if  tempNode.right != nil {
			tempNodeQueue = append(tempNodeQueue, tempNode.right)
		}else{
			isSingleNode = true
		}
	}
	return true
}

4.代码解读

这段代码里面没有多少好说的,就说下for里面第一个if判断叭

这里看下上面流程中最后两个条件,当满足最后两个条件的时候才可以判断出来这颗树是否是完全二叉树.

同样因为实现判断是否是完全二叉树是通过对树的按层遍历来处理的,因为对树的按层遍历通过队列是可以间单的实现的。所以这里使用到了队列

至于这里为什么要单独创建一个isSingleNode变量:

  • 因为当有一个节点左侧节点或者是右侧的节点没有的时候,在这同一层后面如果还有不为空的节点时,那么这颗树便不是完全二叉树,看下图

在这颗树的最后一层绿色涂鸭处是少一个节点的,所以我用了一个变量我标识当前节点(在上图表示节点2)的子节点是不是少一个,如果少了当前节点(在上图表示节点2)的下一个节点(在上图表示节点3)的子节点(在上图表示4和5)如果存在则不是完全二叉树,所以这就是创建了一个isSingleNode变量的作用

5.运行结果

到此这篇关于利用go语言判断是否是完全二叉树的文章就介绍到这了,更多相关go 二叉树内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解如何在Go语言中生成随机种子

    详解如何在Go语言中生成随机种子

    这篇文章主要为大家详细介绍了如何在Go语言中生成随机种子,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-04-04
  • GO语言实现列出目录和遍历目录的方法

    GO语言实现列出目录和遍历目录的方法

    这篇文章主要介绍了GO语言实现列出目录和遍历目录的方法,涉及ioutil.ReadDir()与filepath.Walk()的应用,是非常实用的技巧,需要的朋友可以参考下
    2014-12-12
  • Golang开发动态库的实现

    Golang开发动态库的实现

    这篇文章主要介绍了Golang开发动态库的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • GO语言中常见的排序算法使用示例

    GO语言中常见的排序算法使用示例

    这篇文章主要为大家介绍了GO语言中常见排序算法的使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • Go泛型实战教程之如何在结构体中使用泛型

    Go泛型实战教程之如何在结构体中使用泛型

    这篇文章主要介绍了Go泛型实战教程之如何在结构体中使用泛型,根据Go泛型使用的三步曲提到的:类型参数化、定义类型约束、类型实例化我们一步步来定义我们的缓存结构体,需要的朋友可以参考下
    2022-07-07
  • 使用Go语言开发自动化API测试工具详解

    使用Go语言开发自动化API测试工具详解

    这篇文章主要为大家详细介绍了如何使用Go语言开发自动化API测试工具,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考下
    2024-03-03
  • Golang json 库中的RawMessage功能原理

    Golang json 库中的RawMessage功能原理

    今天我们来学习一个 Golang 官方 json 库提供了一个经典能力RawMessage,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • golang版本升级的简单实现步骤

    golang版本升级的简单实现步骤

    个人感觉Go在众多高级语言中,是在各方面都比较高效的,下面这篇文章主要给大家介绍了关于golang版本升级的简单实现步骤,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 利用golang进行OpenCV学习和开发的步骤

    利用golang进行OpenCV学习和开发的步骤

    目前,OpenCV逐步成为一个通用的基础研究和产品开发平台,下面这篇文章主要给大家介绍了关于利用golang进行OpenCV学习和开发的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-09-09
  • 快速掌握Go语言正/反向代理

    快速掌握Go语言正/反向代理

    这篇文章主要介绍了快速掌握Go语言正/反向代理的相关资料,需要的朋友可以参考下
    2022-11-11

最新评论