二叉树遍历
二叉树遍历
二叉树常见的遍历方式包括层序遍历、前序遍历、中序遍历和后序遍历等。
一、层序遍历
层序遍历(Level-Order Traversal)从顶部到底部逐层遍历二叉树,并在每一层按照从左到右的顺序访问节点。
层序遍历本质上属于广度优先遍历。
1 | 1 |
层序遍历的伪代码类似这样:
1 | void levelOrder(TreeNode root) { |
复杂度分析:
- 时间复杂度:O(n),其中 n 是节点的数量。每个节点恰好会被运算一次。
- 空间复杂度:O(n),为队列的开销,队列中节点的个数不会超过 n。
二、深序遍历
深序遍历(Depth-Order Traversal)从顶部到底部遍历二叉树,并在按照一定的优先级顺序访问节点。
深序遍历本质上属于深度优先遍历。
根据遍历过程中节点访问顺序的不同,深序遍历可分为 3 种类型:
- 前序遍历:根节点 -> 左子树 -> 右子树
- 中序遍历:左子树 -> 根节点 -> 右子树
- 后序遍历:左子树 -> 右子树 -> 根节点
在前中后序中,前中后指的是根节点的访问顺序。
2.1 前序遍历
前序遍历遍历顺序为:根节点 -> 左子树 -> 右子树。
1 | 1 |
前序遍历的伪代码类似这样:
1 | void preOrder(TreeNode root) { |
复杂度分析:
- 时间复杂度:O(n),其中 n 是节点的数量。每个节点恰好会被运算一次。
- 空间复杂度:O(n),为递归过程中栈的开销,平均情况下为 O(logn),最坏情况下树呈现链状,为 O(n)。
2.2 中序遍历
中序遍历遍历顺序为:左子树 -> 根节点 -> 右子树。
1 | 1 |
中序遍历的伪代码类似这样:
1 | void inOrder(TreeNode root) { |
复杂度分析:
- 时间复杂度:O(n),其中 n 是节点的数量。每个节点恰好会被运算一次。
- 空间复杂度:O(n),为递归过程中栈的开销,平均情况下为 O(logn),最坏情况下树呈现链状,为 O(n)。
2.3 后序遍历
后序遍历遍历顺序为:左子树 -> 右子树 -> 根节点。
1 | 1 |
后序遍历的伪代码类似这样:
1 | void postOrder(TreeNode root) { |
复杂度分析:
- 时间复杂度:O(n),其中 n 是节点的数量。每个节点恰好会被运算一次。
- 空间复杂度:O(n),为递归过程中栈的开销,平均情况下为 O(logn),最坏情况下树呈现链状,为 O(n)。
参考
https://www.hello-algo.com/chapter_tree/binary_tree_traversal/