我是一個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.層次 最高層節點處於中間
這次上升難度了,需要提前知道深度