package main
import (
"fmt"
queue "test2/Queue"
)
type Node struct {
value int
Left, Right *Node
}
var q queue.ItemQueue
//創(chuàng)建
func CreateNode(val int) *Node {
return &Node{value: val, Left: nil, Right: nil}
}
//設(shè)置節(jié)點(diǎn)的值
func (node *Node) SetValue(val int) {
node.value = val
}
//打印
func (node *Node) Print() {
fmt.Printf("%+v\n", *node)
}
//前序遍歷
func (node *Node) PreOrder() {
if node == nil {
return
}
node.Print()
node.Left.PreOrder()
node.Right.PreOrder()
}
//中序遍歷
func (node *Node) MidOrder() {
if node == nil {
return
}
node.Left.MidOrder()
node.Print()
node.Right.MidOrder()
}
//后序遍歷
func (node *Node) PostOrder() {
if node == nil {
return
}
node.Left.PostOrder()
node.Right.PostOrder()
node.Print()
}
//廣度優(yōu)先遍歷
func (root *Node) Bforder() {
q.Enqueue(root)
for {
item := q.Dequeue()
node, ok := item.(*Node)
if ok {
node.Print()
if node.Left != nil {
q.Enqueue(node.Left)
}
if node.Right != nil {
q.Enqueue(node.Right)
}
if q.IsEmpty() {
break
}
}
}
}
//獲取高度
//取兩個(gè)子節(jié)點(diǎn)中大的高度+1
func (node *Node) GetTreeHeight() int {
if node == nil {
return 0
}
lHight := node.Left.GetTreeHeight()
rHight := node.Right.GetTreeHeight()
if lHight >= rHight {
return lHight + 1
} else {
return rHight + 1
}
}
//二叉查找
func (node *Node) Find(val int) *Node {
if node == nil {
return nil
}
result := node
if node.value > val {
node = node.Left
result = node.Find(val)
} else if node.value < val {
node = node.Right
result = node.Find(val)
}
return result
}
//插入
func (node *Node) Insert(val int) (*Node, bool) {
if node == nil {
return CreateNode(val), true
}
if val < node.value {
newP, hasNew := node.Left.Insert(val)
if hasNew {
node.Left = newP
}
} else {
newP, hasNew := node.Right.Insert(val)
if hasNew {
node.Right = newP
}
}
return nil, false
}
//刪除
func (node *Node) Delete(val int) *Node {
if node == nil {
return nil
}
// var pNode *Node
// pNode = node
if node.value > val {
node.Left = node.Left.Delete(val)
} else if node.value < val {
node.Right = node.Right.Delete(val)
} else {
//找到需要?jiǎng)h除的節(jié)點(diǎn)了
//節(jié)點(diǎn)有兩個(gè)子節(jié)點(diǎn)
if node.Left != nil && node.Right != nil {
//找到右樹(shù)中最小的點(diǎn)
minNode := node.Right.FindMinNode()
node.Delete(minNode.value)
minNode.Left = node.Left
minNode.Right = node.Right
return minNode
}
//節(jié)點(diǎn)是葉子結(jié)點(diǎn)或者只有一個(gè)子節(jié)點(diǎn)
if node.Left != nil {
return node.Left
} else if node.Right != nil {
return node.Right
} else {
return nil
}
}
return node
}
//查找樹(shù)中最小的節(jié)點(diǎn)
func (node *Node) FindMinNode() *Node {
if node == nil {
return nil
}
var minNode *Node
if node.Left != nil {
minNode = node.Left.FindMinNode()
} else if node.Right != nil {
minNode = node.Right.FindMinNode()
} else {
return node
}
return minNode
}
func main() {
root := CreateNode(33)
root.Left = CreateNode(16)
root.Right = CreateNode(50)
root.Left.Left = CreateNode(13)
root.Left.Right = CreateNode(18)
root.Right.Left = CreateNode(34)
root.Right.Right = CreateNode(58)
root.Left.Left.Right = CreateNode(15)
root.Left.Right.Left = CreateNode(17)
root.Left.Right.Right = CreateNode(25)
root.Right.Right.Left = CreateNode(51)
root.Right.Right.Right = CreateNode(66)
root.Left.Right.Right.Left = CreateNode(19)
root.Left.Right.Right.Right = CreateNode(27)
root.Right.Right.Left.Right = CreateNode(55)
// root.Insert(55)
// root = root.Delete(33)
root.Bforder()
}
golang二叉查找樹(shù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 完全二叉樹(shù)是一種特殊的二叉樹(shù),滿足以下要求: 1.所有葉子節(jié)點(diǎn)都出現(xiàn)在 k 或者 k-1 層,而且從 1 到 k-...
- 為簡(jiǎn)單起見(jiàn),鍵值均為整型。 定義接口(tree.go): 二叉查找樹(shù)(binary_tree.go): 節(jié)點(diǎn)(no...
- 二叉查找樹(shù) 二叉查找樹(shù)(BST)的特性: 1.左子樹(shù)上所有結(jié)點(diǎn)的值均小于或等于它的根結(jié)點(diǎn)的值。 2.右子樹(shù)上所有結(jié)...
- 參考資料:[1]http://www.cnblogs.com/skywang12345/p/3576373.htm...
- 可以由一個(gè)線性輸入序列依照二叉查找樹(shù)的規(guī)則進(jìn)行構(gòu)建 二叉查找樹(shù)的刪除比較復(fù)雜, 詳見(jiàn): https://songl...