package mainimport ( "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 =https://www.cnblogs.com/lurenq/p/= 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 = https://www.cnblogs.com/lurenq/p/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}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/53037.html
標籤:Go
上一篇:GO 語言常用排序
