• golang简单实现二叉树的数据添加和遍历


    代码实现

    package tree
    
    import "fmt"
    
    type Node struct {
    	elem        interface{}
    	left, right *Node
    }
    
    type Tree struct {
    	root *Node
    }
    
    func NewTree() *Tree {
    	return &Tree{}
    }
    
    // 添加元素
    func (this *Tree) Add(v interface{}) {
    	node := &Node{elem: v}
    	if this.root == nil {
    		this.root = node
    		return
    	}
    
    	c := make(chan *Node, 10)
    	c <- this.root
    
    	for len(c) > 0 {
    		curNode := <-c
    		if curNode.left == nil {
    			curNode.left = node
    			return
    		} else {
    			c <- curNode.left
    		}
    		if curNode.right == nil {
    			curNode.right = node
    			return
    		} else {
    			c <- curNode.right
    		}
    	}
    }
    
    // 广度优先遍历
    func (this *Tree) Travel() {
    	if this.root == nil {
    		fmt.Println("empty tree")
    		return
    	}
    
    	c := make(chan *Node, 10)
    	c <- this.root
    
    	for len(c) > 0 {
    		curNode := <-c
    		fmt.Println(curNode.elem)
    		if curNode.left != nil {
    			c <- curNode.left
    		}
    		if curNode.right != nil {
    			c <- curNode.right
    		}
    	}
    }
    
    // 先序遍历
    func (this *Tree) Xianxu() {
    	xz(this.root)
    }
    
    // 中序遍历
    func (this *Tree) ZhongXu() {
    	zx(this.root)
    }
    
    // 后序遍历
    func (this *Tree) HouXu() {
    	hx(this.root)
    }
    
    func xz(node *Node) {
    	if node == nil {
    		return
    	}
    	fmt.Println(node.elem)
    	xz(node.left)
    	xz(node.right)
    }
    
    func zx(node *Node) {
    	if node == nil {
    		return
    	}
    	zx(node.left)
    	fmt.Println(node.elem)
    	zx(node.right)
    }
    
    func hx(node *Node) {
    	if node == nil {
    		return
    	}
    	hx(node.left)
    	hx(node.right)
    	fmt.Println(node.elem)
    }
    
    

    测试

    package tree
    
    import "testing"
    
    var tree *Tree
    
    func prepare() {
    	tree = NewTree()
    	tree.Add("mark")
    	tree.Add("jack")
    	tree.Add("timo")
    	tree.Add("marry")
    	tree.Add("toshiyuki")
    	tree.Add("naruto")
    	tree.Add("sakura")
    }
    
    func TestTree_Travel(t *testing.T) {
    	prepare()
    	tree.Travel()
    
    }
    
    func TestTree_Xianxu(t *testing.T) {
    	prepare()
    	tree.Xianxu()
    
    }
    
    func TestTree_ZhongXu(t *testing.T) {
    	prepare()
    	tree.ZhongXu()
    
    }
    func TestTree_HouXu(t *testing.T) {
    	prepare()
    	tree.HouXu()
    
    }
    

    测试结果

    === RUN   TestTree_Travel
    mark
    jack
    timo
    marry
    toshiyuki
    naruto
    sakura
    --- PASS: TestTree_Travel (0.00s)
    === RUN   TestTree_Xianxu
    mark
    jack
    marry
    toshiyuki
    timo
    naruto
    sakura
    --- PASS: TestTree_Xianxu (0.00s)
    === RUN   TestTree_ZhongXu
    marry
    jack
    toshiyuki
    mark
    naruto
    timo
    sakura
    --- PASS: TestTree_ZhongXu (0.00s)
    === RUN   TestTree_HouXu
    marry
    toshiyuki
    jack
    naruto
    sakura
    timo
    mark
    --- PASS: TestTree_HouXu (0.00s)
    PASS
    
  • 相关阅读:
    c++ 的几种强制转换的讨论
    观察者模式
    epoll实现linux进程通信
    vim 实现 go to definition的功能
    svn 的使用
    makefile文件的技术
    [转]epoll技术
    [转]poll技术
    Linux重定向的理解
    避免僵死进程的方法
  • 原文地址:https://www.cnblogs.com/endurance9/p/10434738.html
Copyright © 2020-2023  润新知