前置知识:无

建议:会同学可以跳过

二叉树的节点

type BinaryTreeNode[T any] struct {
	Val   T
	Left  *BinaryTreeNode
	Right *BinaryTreeNode
}

二叉树的先序、中序、后序

  • 先序:“左右”
  • 中序:“左右”
  • 后序:“左右

任何一棵子树都要满足这个顺序

很好记,什么序是指“根”在哪

递归序加工出三种序的遍历

func recursiveOrder(root *BinaryTreeNode) {
	if root == nil {
		return
	}
 
	// 第一次访问 root
 
	recursiveOrder(root.Left)
 
	// 第二次访问 root
 
	recursiveOrder(root.Right)
 
	// 第三次访问 root
}

递归序:在递归过程中,每一个非 nil 节点都会被访问 3 次!每次都操作(如:打印)的顺序

  • 先序:每访问一个节点,第一次访问则进行操作(如:打印),第二次、第三次不操作
  • 中序:第二次访问操作,第一次、第三次不操作
  • 后序:第三次访问操作,第一次、第二次不操作

递归遍历二叉树复杂度分析

  • 时间复杂度 O(n)
    • 一个非空节点访问三次
  • 额外空间复杂度 O(h)h 是二叉树的高度
    • 递归的空间占用:递归过程中占用的系统调用栈的空间
    • 最高会压到树高层的递归

备注

关于递归更多的内容会在【必备】课程里继续

二叉树更多更难的题会在【必备】课程里继续