二叉树的遍历
遍历按某种次序访问树中每个结点恰好一次。二叉树最常用的是前序、中序、后序与层序。
结点定义见 二叉树。
本文解决什么问题
- 四种遍历的次序与递归写法
- 层序与队列的关系
- 非递归(显式栈)直觉
- 各遍历的典型用途
三种递归遍历
对结点 ,左右子树 、:
| 名称 | 顺序 | 口诀 |
|---|---|---|
| 前序(先序) | 根左右 | |
| 中序 | 左根右 | |
| 后序 | 左右根 |
void preorder(TreeNode *root) {
if (!root) return;
printf("%d ", root->data);
preorder(root->left);
preorder(root->right);
}
void inorder(TreeNode *root) {
if (!root) return;
inorder(root->left);
printf("%d ", root->data);
inorder(root->right);
}
void postorder(TreeNode *root) {
if (!root) return;
postorder(root->left);
postorder(root->right);
printf("%d ", root->data);
}
时间均为 (每个结点进出常数次);递归栈空间最坏 (斜树),平衡时约 。