資料結構和演算法-Go實現二叉搜尋樹

littlexiaoshuishui發表於2020-08-20

二叉樹是面試經常考的

package main

import "fmt"

type Node struct{
    Value int
    leftNode *Node
    rightNode *Node
}
type BinaryTree struct{
    len int
    root *Node
}
func NewNode(data int) *Node{
    return &Node{data,nil,nil}
}
func (node *Node)Insert(data int){
    if node.Value > data {
        if node.leftNode != nil{
            node.leftNode.Insert(data)
        }else{
            node.leftNode = NewNode(data)
        }
    }else{
        if node.rightNode != nil{
            node.rightNode.Insert(data)
        }else{
            node.rightNode = NewNode(data)
        }
    }
}
func (node *Node)middleShow(){
    if node.leftNode != nil{
        node.leftNode.middleShow()
    }
    fmt.Println(node.Value)
    if node.rightNode != nil{
        node.rightNode.middleShow()
    }
}
func (node *Node)search(data int) *Node{
    if node.Value == data {
        return node
    }else if node.Value > data {
        if node.leftNode != nil {
            return node.leftNode.search(data)
        }
    }else{
        if node.rightNode != nil{
            return node.rightNode.search(data)
        }
    }
    return nil
}
//----------------------------------------------------
func NewTree() *BinaryTree{
    return &BinaryTree{0,nil}
}
//插入一個資料
func (tree *BinaryTree)Insert(data int){
    tree.len++
    if tree.root != nil{
        tree.root.Insert(data)
    }else{
        tree.root = NewNode(data)
    }
}
//查詢值相等的節點
func (tree *BinaryTree)Search(data int) *Node{
    if tree.root != nil {
        return tree.root.search(data)
    }else{
        return nil
    }
}

//前序遍歷 根節點->左子樹->右子樹
//中序遍歷 左子樹->根節點->右子樹
func (tree *BinaryTree)MiddleShow(){
    if tree.root == nil{
        return
    }
    tree.root.middleShow()
}

func main(){
    tree := NewTree()
    tree.Insert(4)
    tree.Insert(6)
    tree.Insert(1)
    tree.Insert(9)
    tree.Insert(2)
    target := tree.Search(60)
    fmt.Println(target)
    tree.MiddleShow()
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章