GO函数式编程(二叉树应用)

先看一下通常的二叉树写法,上代码:

package main

import (
	"fmt"
)

type Node struct {
	LeftNode *Node
	RightNode *Node
	Value int
}

func buildTree() Node {
	var tree Node
	tree.Value = 0

	tree.LeftNode = new(Node)
	tree.LeftNode.Value = 1

	tree.LeftNode.LeftNode = new(Node)
	tree.LeftNode.LeftNode.Value = 3

	tree.LeftNode.LeftNode.LeftNode = new(Node)
	tree.LeftNode.LeftNode.LeftNode.Value = 5

	tree.LeftNode.LeftNode.RightNode = new(Node)
	tree.LeftNode.LeftNode.RightNode.Value = 6

	tree.RightNode = new(Node)
	tree.RightNode.Value = 2

	tree.RightNode.LeftNode = new(Node)
	tree.RightNode.LeftNode.Value = 4

	tree.RightNode.LeftNode.RightNode = new(Node)
	tree.RightNode.LeftNode.RightNode.Value = 7

	return tree
}

func (node Node)do()  {
	fmt.Println(node.Value)
	if node.LeftNode != nil {
		node.LeftNode.do()
	}
	if node.RightNode != nil{
		node.RightNode.do()
	}
}

func main() {
	tree := buildTree()
	tree.do()
}

函数式编程的写法:

node.go

package node

type Node struct {
LeftNode *Node
RightNode *Node
Value int
}

func (node Node)Do(f func(n *Node)) {
f(&node)
if node.LeftNode != nil {
node.LeftNode.Do(f)
}
if node.RightNode != nil{
node.RightNode.Do(f)
}
}

main.go

package main

import (
	"fmt"
	"go_study/005_function/treenode/node"
	"strconv"
)


func buildTree() node.Node {
	var tree node.Node
	tree.Value = 0

	tree.LeftNode = new(node.Node)
	tree.LeftNode.Value = 1

	tree.LeftNode.LeftNode = new(node.Node)
	tree.LeftNode.LeftNode.Value = 3

	tree.LeftNode.LeftNode.LeftNode = new(node.Node)
	tree.LeftNode.LeftNode.LeftNode.Value = 5

	tree.LeftNode.LeftNode.RightNode = new(node.Node)
	tree.LeftNode.LeftNode.RightNode.Value = 6

	tree.RightNode = new(node.Node)
	tree.RightNode.Value = 2

	tree.RightNode.LeftNode = new(node.Node)
	tree.RightNode.LeftNode.Value = 4

	tree.RightNode.LeftNode.RightNode = new(node.Node)
	tree.RightNode.LeftNode.RightNode.Value = 7

	return tree
}

func main() {
	tree := buildTree()
	count := 0
	tree.Do(func(n *node.Node) {
		count++
		fmt.Println("count : "+strconv.Itoa(count))
	})

	tree.Do(func(n *node.Node) {

		fmt.Println("value : "+strconv.Itoa(n.Value))
	})
}

可以看出函数式编程比较灵活一些,可以灵活的做你想要做到的事情

猜你喜欢

转载自blog.csdn.net/wangqiang9x/article/details/88535102
今日推荐