二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。

前序遍历
基本思想:先访问当前结点,再前序遍历左子树,最后再前序遍历右子树即根—左—右
图中前序遍历结果是:1,2,4,5,7,8,3,6
中序遍历
基本思想:先中序遍历左子树,然后再访问当前结点,最后再中序遍历右子树即左—根—右
图中中序遍历结果是:4,2,7,8,5,1,3,6
后序遍历
基本思想:先后序遍历左子树,然后再后序遍历右子树,最后再访问当前结点即左—右—根
图中后序遍历结果是:4,8,7,5,2,6,3,1
层次遍历
基本思想:从第一层开始,依此遍历每层,直到结束
图中层次遍历结果是:1,2,3,4,5,6,7,8

package mainimport "fmt"//定义二叉树的节点type Node struct {value intleft *Noderight *Node}func (node *Node) Print() {fmt.Printf("%d ", node.value)}//功能:设置节点的值//参数:节点的值//返回值:nilfunc (node *Node) SetValue(value int) {node.value = value}//功能:创建节点//参数:节点的值//返回值:nilfunc CreateNode(value int) *Node {return &Node{value, nil, nil}}//功能:求树的高度,递归实现//参数:根节点//返回值:树的高度,树的高度=Max(左子树高度,右子树高度)+1func (node *Node) GetTreeHeigh() int {if node == nil {return 0} else {lHeigh := node.left.GetTreeHeigh()rHeigh := node.right.GetTreeHeigh()if lHeigh > rHeigh {return lHeigh + 1} else {return rHeigh + 1}}}//功能:求树的高度,通过遍历实现func (node *Node) GetTreeHeighByQueue() int {if node == nil {return 0}height := 0nodes := []*Node{node}for len(nodes) > 0 {height++size := len(nodes) // 每层的节点数count := 0for count < size { // 保证for循环执行完nodes都是不通层的数据count++currentNode := nodes[0]nodes = nodes[1:]if currentNode.left != nil {nodes = append(nodes, currentNode.left)}if currentNode.right != nil {nodes = append(nodes, currentNode.right)}}}return height}//前序遍历func (node *Node) PreOrder() {if node == nil {return}node.Print()node.left.PreOrder()node.right.PreOrder()}//中序遍历func (node *Node) MiddleOrder() {if node == nil {return}node.left.PostOrder()node.Print()node.right.PostOrder()}//后序遍历func (node *Node) PostOrder() {if node == nil {return}node.left.PostOrder()node.right.PostOrder()node.Print()}//层次遍历func (node *Node) BreadthFirstSearch() {if node == nil {return}res := []int{}nodes := []*Node{node}for len(nodes) > 0 {currentNode := nodes[0]res = append(res, currentNode.value)nodes = nodes[1:]if currentNode.left != nil {nodes = append(nodes, currentNode.left)}if currentNode.right != nil {nodes = append(nodes, currentNode.right)}}for _, v := range res {fmt.Print(v, " ")}}func main() {root := CreateNode(0)root.left = CreateNode(1)root.right = CreateNode(2)root.left.right = CreateNode(4)root.left.left = CreateNode(3)root.left.right.left = CreateNode(7)root.right.left = CreateNode(5)root.right.right = CreateNode(6)fmt.Println(root.GetTreeHeigh()) // 4fmt.Println(root.GetTreeHeighByQueue()) // 4root.PreOrder() // 0 1 3 4 7 2 5 6fmt.Println()root.MiddleOrder() // 3 7 4 1 0 5 6 2fmt.Println()root.PostOrder() // 3 7 4 1 5 6 2 0fmt.Println()root.BreadthFirstSearch() // 0 1 2 3 4 5 6 7}
