go語言 二叉樹

 

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
}
相關文章
相關標籤/搜索