背景
在leetcode上写代码时,二叉树是提前构建好的
例如这样,他给你传进去一个头结点指针
但是在本地不好调试,相信有不少伙伴也会有这个疑问
代码
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
// BFS的数组翻译为二叉树
func createTreeNode(nums []int) *TreeNode {
var root *TreeNode
var queue []*TreeNode
for i := 0; i < len(nums); i += 2 {
if i == 0 {
root = &TreeNode{Val: nums[i]}
queue = append(queue, root)
}
// 其实就是lis.Remove(lis.Front()),pop掉队列首元素
parentNode := queue[0]
queue = queue[1:]
// 添加左节点
if i+1 < len(nums) && nums[i+1] != -1 {
parentNode.Left = &TreeNode{Val: nums[i+1]}
// 在队尾添加
queue = append(queue, parentNode.Left)
}
// 添加右节点, 如果-1, 那么说明没有这个分支
if i+2 < len(nums) && nums[i+2] != -1 {
parentNode.Right = &TreeNode{Val: nums[i+2]}
queue = append(queue, parentNode.Right)
}
}
return root
}
func createTreeNode2(nums []int) *TreeNode {
var root *TreeNode
quene := list.New()
for i := 0; i < len(nums); i += 2 {
if i == 0 {
root = &TreeNode{Val: nums[i]}
quene.PushBack(root)
}
//parentNode := quene.Front()
parentNode := quene.Remove(quene.Front()).(*TreeNode)
// 添加左节点
if i+1 < len(nums) && nums[i+1] != -1 {
parentNode.Left = &TreeNode{Val: nums[i+1]}
quene.PushBack(parentNode.Left)
}
// 添加右节点
if i+2 < len(nums) && nums[i+2] != -1 {
parentNode.Right = &TreeNode{Val: nums[i+2]}
quene.PushBack(parentNode.Right)
}
}
return root
}
// 递归
func (node *TreeNode) New(index int, data []int) *TreeNode {
if node == nil {
return nil
}
bin := &TreeNode{data[index], nil, nil}
// 设置完全二叉树左节点 其特征是深度 *2+1为左节点 +2为右节点
if index < len(data) && 2*index+1 < len(data) {
fmt.Println()
bin.Left = bin.New(index*2+1, data)
}
if i < len(data) && 2*index+2 < len(data) {
bin.Right = bin.New(index*2+2, data)
}
return bin
}