天机阁

94. 二叉树的中序遍历

2022-07-05 · 2 min read
LeetCode

题目

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

难度:🌟🌟🌟🌟

示例 1:

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

题解

中序遍历是指对树按照 左、根、右 的规律进行访问。
可以使用递归遍历,也可使用迭代遍历。
区别在于递归的时候隐式地维护了一个栈,而我们在迭代的时候需要显式地将这个栈模拟出来,其他都相同

代码实现

// 递归遍历
func inorderTraversal(root *TreeNode) (res []int) {
	var inorder func(node *TreeNode)
	inorder = func(node *TreeNode) {
		if node == nil {
			return
		}
		inorder(node.Left)
		res = append(res, node.Val)
		inorder(node.Right)
	}
	inorder(root)
	return
}

// 迭代遍历
func inorderTraversal1(root *TreeNode) (res []int) {
	if root == nil {
		return nil
	}
	var stack []*TreeNode
	for root != nil || len(stack) > 0 {
		for root != nil {
			stack = append(stack, root)
			root = root.Left
		}
		// 此时 栈 中全是左节点
		root = stack[len(stack)-1]
		// 删除栈顶节点
		stack = stack[:len(stack)-1]
		res = append(res, root.Val)
		root = root.Right
	}
	return res
}