vlambda博客
学习文章列表

二叉树与队列的互相转化



//go语言版本



package main

import "fmt"
/*
知识点:二叉树 <<==---==>> 队列
*/
//定义二叉树节点
type TreeNode2020 struct {
Val int
Left, Right *TreeNode2020
}

//创建一个二叉树节点
func createNode(nodeVaL int) (node *TreeNode2020) {
if nodeVaL == -1 { //这里-1代表null节点
return nil
}
node = &TreeNode2020{
Val: nodeVaL,
Left: nil,
Right: nil,
}
return
}

//创建二叉树,通过中序遍历的数组
func createTreeByMidSearch(midArr []int) (root *TreeNode2020) {

valArr := midArr //备份一个,队列
//首先,创建根节点
root = createNode(valArr[0])
valArr = valArr[1:] //相当于pop出前一个,向后移动一位
nodeArr := []*TreeNode2020{root} //保存二叉树所有的节点信息,为了下次接着给子节点赋值
for len(valArr) > 0 {
cur := nodeArr[0]
nodeArr = nodeArr[1:] //相当于pop出前一个,向后移动一位,节点与val是一一对应的
cur.Left = createNode(valArr[0]) //左叶子节点
valArr = valArr[1:] //相当于pop出前一个,向后移动一位
if cur.Left != nil {
nodeArr = append(nodeArr,cur.Left )
}


cur.Right = createNode(valArr[0]) //右叶子节点
valArr = valArr[1:] //相当于pop出前一个,向后移动一位
if cur.Right != nil {
nodeArr = append(nodeArr,cur.Right )
}
}
return root
}



//------递归方式----------------------------------------
//前序遍历: 根节点-->左子节点-->右子节点
func PreviousSearch(root *TreeNode2020){
if root == nil{
fmt.Println("NULL")
return
}
fmt.Println(root.Val)
PreviousSearch(root.Left)
PreviousSearch(root.Right)
}


//---------递推方式------前序遍历---------------------------------
//思路:空间保存节点,用队列-先进先出
func PreviousSearchByNext(root *TreeNode2020){
nodeArr := []*TreeNode2020{root} //队列,先进先出
valArr := []int{}

for len(nodeArr) > 0 {
cur := nodeArr[0]
nodeArr = nodeArr[1:] //pop出第一个节点,向后走一个
valArr = append(valArr, cur.Val)

if cur.Left != nil{
nodeArr = append(nodeArr, cur.Left) //按照前序遍历的顺序存进去,先进先出
}

if cur.Left != nil{
nodeArr = append(nodeArr, cur.Right)//按照前序遍历的顺序存进去,后进后出
}
}
for key, value := range valArr {
fmt.Println("key==>",key,"val==>",value)
}
}



func main() {
fmt.Println("二叉树的层次遍历练习,2020-11-19")
valArr := []int{3,9,20,-1,-1,15,7}
root := createTreeByMidSearch(valArr)
//PreviousSearch(root) //验证一下
PreviousSearchByNext(root) //验证一下
}