ACM模式数组构建二叉树Go语言实现

目的

想输入一个数组,然后构造二叉树

例如数组为[6, 2, 8, 0, 4, 7, 9, -1, -1, 3, 5]

对应的二叉树为:

参考资料

ACM模式数组构建二叉树

重点:如果父节点的数组下标是i,那么它的左孩子下标就是i*2+1,右孩子下标就是i*2+2

go代码实现

go 复制代码
package main

import "fmt"

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

// 根据数组构造二叉树
func constructBinaryTree(nums []int) *TreeNode {
	treenode := make([]*TreeNode, len(nums))
	for i := 0; i < len(nums); i++ {
		var node *TreeNode //如果等于-1的话就是nil
		if nums[i] != -1 {
			node = &TreeNode{Val: nums[i]}
			treenode[i] = node
		}
	}
	for i := 0; i*2+2 < len(nums); i++ {
		if treenode[i] != nil {
			treenode[i].Left = treenode[i*2+1]
			treenode[i].Right = treenode[i*2+2]
		}
	}
	return treenode[0] //root=treenode[0]
}

// 前序遍历-用于验证
func preorderTraversal(root *TreeNode) (res []int) {
	var traversal func(node *TreeNode)
	traversal = func(node *TreeNode) {
		if node == nil {
			return
		}
		res = append(res, node.Val)
		traversal(node.Left)
		traversal(node.Right)
	}
	traversal(root)
	return res
}

// 中序遍历-用于验证
func inorderTraversal(root *TreeNode) (res []int) {
	var traversal func(node *TreeNode)
	traversal = func(node *TreeNode) {
		if node == nil {
			return
		}
		traversal(node.Left)
		res = append(res, node.Val)
		traversal(node.Right)
	}
	traversal(root)
	return res
}

// 后序遍历-用于验证
func postorderTraversal(root *TreeNode) (res []int) {
	var traversal func(node *TreeNode)
	traversal = func(node *TreeNode) {
		if node == nil {
			return
		}
		traversal(node.Left)
		traversal(node.Right)
		res = append(res, node.Val)
	}
	traversal(root)
	return res
}

func main() {
	nums := []int{6, 2, 8, 0, 4, 7, 9, -1, -1, 3, 5}
	root := constructBinaryTree(nums)
	fmt.Println("前序遍历:", preorderTraversal(root))
	fmt.Println("中序遍历:", inorderTraversal(root))
	fmt.Println("后序遍历:", postorderTraversal(root))
}

输出:

复制代码
前序遍历: [6 2 0 4 3 5 8 7 9]
中序遍历: [0 2 3 4 5 6 7 8 9] 
后序遍历: [0 3 5 4 2 7 9 8 6] 
相关推荐
Grassto1 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto3 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室4 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题4 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo
啊汉6 天前
古文观芷App搜索方案深度解析:打造极致性能的古文搜索引擎
go·软件随想
asaotomo6 天前
一款 AI 驱动的新一代安全运维代理 —— DeepSentry(深哨)
运维·人工智能·安全·ai·go
码界奇点7 天前
基于Gin与GORM的若依后台管理系统设计与实现
论文阅读·go·毕业设计·gin·源代码管理
迷迭香与樱花7 天前
Gin 框架
go·gin
只是懒得想了7 天前
用Go通道实现并发安全队列:从基础到最佳实践
开发语言·数据库·golang·go·并发安全
fenglllle8 天前
使用fyne做一个桌面ipv4网段计算程序
开发语言·go