2021-08-15 20:15:43

二叉树的其它遍历

二叉树的DFS-BFS遍历,分而治之…代码记录

完整代码

  • 新建文件
  • 复制粘贴
  • 运行代码

效果截图

测试数据

image.png

运行结果

image.png

代码

package main

import (
	"log"
)

type Node struct {
	Val   int
	Left  *Node
	Right *Node
}

// 测试数据
// 	3
// / \
// 9  20
//  /  \
// 15   7
func main() {
	tree := Node{}
	tree.Val = 3
	tree.Left = &Node{
		Val: 9,
	}
	tree.Right = &Node{
		Val: 20,
		Left: &Node{
			Val: 15,
		},
		Right: &Node{
			Val: 7,
		},
	}
	log.Printf("%-10s\t%v", "深度优先(先序)", Dfs(&tree))
	log.Printf("%-10s\t%v", "深度优先(先序)-分治", DfsDivide(&tree))
	log.Printf("%-10s\t%v", "广度优先-层次", Bfs(&tree))
}

// DFS 深度搜索(从上到下) 和分治法区别:前者一般将最终结果通过指针参数传入,后者一般递归返回结果最后合并

// 深度优先
func Dfs(root *Node) []int {
	ret := make([]int, 0, 4)
	dfs(root, &ret)
	return ret
}
func dfs(root *Node, ret *[]int) {
	if root == nil {
		return
	}
	*ret = append(*ret, root.Val)
	dfs(root.Left, ret)
	dfs(root.Right, ret)
}

// 深度优先-分治
func DfsDivide(root *Node) []int {
	ret := make([]int, 0, 4)
	if root == nil {
		return ret
	}
	left := DfsDivide(root.Left)
	right := DfsDivide(root.Right)
	ret = append(ret, root.Val)
	ret = append(ret, left...)
	ret = append(ret, right...)
	return ret
}

// 广度优先
func Bfs(root *Node) [][]int {
	ret := make([][]int, 0, 4)
	queue := make([]*Node, 0, 4)
	queue = append(queue, root)
	// 队列里面有节点就一直计算
	for len(queue) > 0 {
		// 队列目前长度-当前树层有多少个节点
		ln := len(queue)
		item := make([]int, 0, 4)
		for i := 0; i < ln; i++ {
			// 出队
			curr := queue[0]
			queue = queue[1:]
			// 以此加入左右子节点
			if curr.Left != nil {
				queue = append(queue, curr.Left)
			}
			if curr.Right != nil {
				queue = append(queue, curr.Right)
			}
			item = append(item, curr.Val)
		}
		ret = append(ret, item)
	}
	return ret
}

本文链接:https://blog.zxysilent.com/post/tree-oth-visit.html

-- EOF --

Comments