我是一个go代码小白菜,心里有算法 落笔不知道怎么写,下面就是我对二叉树的层级遍历的 演变 实现过程,祝自己成长!!!
- 一:一个满二叉树的层级输出:
- 1.输出:一列一个形式
代码如下:
package main
import "fmt"
type Node struct {
Data *TreeNode
Next *Node
}
type List struct {
Head *Node
Tail *Node
}
//树结构体
type TreeNode struct {
value interface{}
Left *TreeNode
Right *TreeNode
}
//创建树
func createTree(v interface{}) *TreeNode {
return &TreeNode{v, nil, nil}
}
//创建空链表
func createList() *List{
return &List{nil, nil}
}
func (list *List) push(Treenode *TreeNode) {
node := &Node{Treenode, nil}
if(list.Head == nil){
list.Head = node
list.Tail = node
}else{
if(list.Head == list.Tail){
list.Head.Next = node
list.Tail = node
}else{
list.Tail.Next = node
list.Tail = node
}
}
}
func (list *List) pull() *TreeNode{
tree := list.Head.Data
list.Head = list.Head.Next
return tree
}
func isNull(list *List) bool{
if(list.Head == nil){
return true
}else{
return false
}
}
func main() {
tree := createTree(1)
tree.Left = createTree(2)
tree.Right = createTree(3)
tree.Left.Left = createTree(4)
tree.Left.Right = createTree(5)
tree.Right.Left = createTree(6)
tree.Right.Right = createTree(7)
//二叉树准备好 现在层级遍历
AList := createList()
BList := createList()
lsit := pollTree(tree, AList, BList)
pullTree(lsit)
}
func pullTree(list *List){
if(list.Head != nil){
reet := list.pull()
fmt.Println(reet.value)
pullTree(list)
}
}
func pollTree(tree *TreeNode, Alist *List, Blist *List) *List{
if(tree.Left != nil){
Blist.push(tree.Left)
}
if(tree.Right != nil){
Blist.push(tree.Right)
}
Alist.push(tree)
if(isNull(Blist) == false){
pollTree(Blist.pull() , Alist, Blist)
}
return Alist
}
- 2.层次输出
一部分的代码函数 pullTree 替换
func pullTree(list *List){
num := 1;
for {
if(list.Head == nil){
break
}
for i := 0; i< num; i++ {
reet := list.pull()
if i == num - 1 {
fmt.Println(reet.value)
}else{
fmt.Print(reet.value," ")
}
}
num = num*2
}
}
- 3.层次 最高层节点处于中间
这次上升难度了,需要提前知道深度