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] 
相关推荐
梦想很大很大7 分钟前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰5 小时前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘9 小时前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤9 小时前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt111 天前
AI DDD重构实践
go
Grassto2 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto4 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室5 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题5 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo
啊汉7 天前
古文观芷App搜索方案深度解析:打造极致性能的古文搜索引擎
go·软件随想