package main import ( "fmt" "reflect" ) type BinaryNode struct { Data interface{} //數據 lChild *BinaryNode //左子樹 rChild *BinaryNode //右子樹 } //創建二叉樹 fun... ...
package main import ( "fmt" "reflect" ) type BinaryNode struct { Data interface{} //數據 lChild *BinaryNode //左子樹 rChild *BinaryNode //右子樹 } //創建二叉樹 func (node *BinaryNode) Create() { node = new(BinaryNode) } //先序遍歷 func (node *BinaryNode) PreOrder() { if node == nil { return } //DLR — 先序遍歷,即先根再左再右 fmt.Println(node.Data) //遞歸遍歷左子樹 node.lChild.PreOrder() //遞歸遍歷右子樹 node.rChild.PreOrder() } //中序遍歷 func (node *BinaryNode) MidOrder() { if node == nil { return } //LDR — 中序遍歷,即先左再根再右 //遞歸遍歷左子樹 node.lChild.MidOrder() //列印數據 fmt.Println(node.Data) //遞歸遍歷右子樹 node.rChild.MidOrder() } //後序遍歷 func (node *BinaryNode) RearOrder() { if node == nil { return } //LRD — 後序遍歷,即先左再右再根 //遞歸遍歷左子樹 node.lChild.RearOrder() //遞歸遍歷右子樹 node.rChild.RearOrder() //列印數據 fmt.Println(node.Data) } //二叉樹高度 深度 func (node *BinaryNode) TreeHeight() int { if node == nil { return 0 } //進入下一層遍歷 lh := node.lChild.TreeHeight() rh := node.rChild.TreeHeight() if lh > rh { lh++ return lh } else { rh++ return rh } } //二叉樹葉子節點個數 //葉子節點是沒有後繼的節點 func (node *BinaryNode) LeafCount(num *int) { if node == nil { return } //判斷沒有後繼的節點為葉子節點 if node.lChild == nil && node.rChild == nil { (*num)++ } node.lChild.LeafCount(num) node.rChild.LeafCount(num) } //二叉樹數據查找 func (node *BinaryNode) Search(Data interface{}) { if node == nil { return } //== 不支持slice 和 map //reflect.DeepEqual() if reflect.TypeOf(node.Data) == reflect.TypeOf(Data) && node.Data == Data { fmt.Println("找到數據", node.Data) return } node.lChild.Search(Data) node.rChild.Search(Data) } //二叉樹銷毀 func (node *BinaryNode) Destroy() { if node == nil { return } node.lChild.Destroy() node.lChild = nil node.rChild.Destroy() node.rChild = nil node.Data = nil } //二叉樹反轉 //如果想反轉二叉樹 二叉樹必須是一個滿二叉樹 func (node *BinaryNode) Reverse() { if node == nil { return } //交換節點 多重賦值 node.lChild, node.rChild = node.rChild, node.lChild node.lChild.Reverse() node.rChild.Reverse() } //二叉樹拷貝 func (node *BinaryNode) Copy() *BinaryNode { if node == nil { return nil } lChild:=node.lChild.Copy() rChild:=node.rChild.Copy() //創建寫節點 拷貝數據 newNode:=new(BinaryNode) newNode.Data=node.Data newNode.lChild=lChild newNode.rChild=rChild return newNode }