
递归实现
- 前序遍历
- 中序遍历
- 后序遍历
- 层序遍历
层序遍历: 按照二叉树中的层次从左到右依次遍历每层中的结点 借助队列先进先出的特性,从树的根结点开始,依次将其左子节点和右子节点入队。 而后每次队列中一个结点出队,都将其左子节点和右子节点入队,直到树中所有结点都出队, 出队结点的先后顺序就是层次遍历的最终结果
代码
// 二叉树package mainimport "fmt"type Hero struct {No intName stringLeft *Hero // 指向左边节点的指针Right *Hero // 指向右边节点的指针}// 前序遍历 - 先输出根节点,然后输出左子树,最后输出右子树func PreOrder(node *Hero) {if node != nil {// 递归调用,先根再左后右fmt.Printf("No=%v, Name=%v \n", node.No, node.Name)PreOrder(node.Left)PreOrder(node.Right)}}// 中序遍历 - 先输出左子树,然后输出根节点,最后输出右子树func InfixOrder(node *Hero) {if node != nil {// 递归调用,先左再根后右InfixOrder(node.Left)fmt.Printf("No=%v, Name=%v \n", node.No, node.Name)InfixOrder(node.Right)}}// 后序遍历 - 先输出左子树,然后输出右子树,最后输出根节点func PostOrder(node *Hero) {if node != nil {// 递归调用,先左再右后根PostOrder(node.Left)PostOrder(node.Right)fmt.Printf("No=%v, Name=%v \n", node.No, node.Name)}}/*层序遍历:借助队列先进先出的特性,从树的根结点开始,依次将其左子节点和右子节点入队。而后每次队列中一个结点出队,都将其左子节点和右子节点入队,直到树中所有结点都出队,出队结点的先后顺序就是层次遍历的最终结果*/func levelOrder(node *Hero) [][]int {ret := [][]int{} // 定义一个存放遍历之后的数组fmt.Printf("res类型: %T \n", ret)if node == nil {return ret}q := []*Hero{node} // 将整颗树怼进队列里for i := 0; len(q) > 0; i++ {ret = append(ret, []int{})p := []*Hero{}for j := 0; j < len(q); j++ {node := q[j]ret[i] = append(ret[i], node.No)if node.Left != nil {p = append(p, node.Left)}if node.Right != nil {p = append(p, node.Right)}}q = p}return ret}func main() {// 构建二叉树root := &Hero{No: 1,Name: "xixi",}left1 := &Hero{No: 2,Name: "haha",}left2 := &Hero{No: 10,Name: "1010",}right02 := &Hero{No: 11,Name: "1111",}right1 := &Hero{No: 3,Name: "hehe",}right2 := &Hero{No: 4,Name: "heihei",}right5 := &Hero{No: 5,Name: "5555",}root.Left = left1root.Right = right1right1.Right = right2left1.Left = left2left1.Right = right02right1.Left = right5fmt.Println("前序遍历---")// 前序遍历PreOrder(root)fmt.Println("中序遍历---")// 中序遍历InfixOrder(root)// 后续遍历fmt.Println("后续遍历---")PostOrder(root)fmt.Println("层序遍历---")arr := levelOrder(root)fmt.Println("arr = ", arr)}// 前序遍历/*No=1, Name=xixiNo=2, Name=hahaNo=10, Name=1010No=11, Name=1111No=3, Name=heheNo=5, Name=5555No=4, Name=heihei*/// 中序遍历/*No=10, Name=1010No=2, Name=hahaNo=11, Name=1111No=1, Name=xixiNo=5, Name=5555No=3, Name=heheNo=4, Name=heihei*/// 后序遍历/*No=10, Name=1010No=11, Name=1111No=2, Name=hahaNo=5, Name=5555No=4, Name=heiheiNo=3, Name=heheNo=1, Name=xixi*/// 层序遍历---/* res类型: [][]intarr = [[1] [2 3] [10 11 5 4]] */
