c++数据结构7——二叉树的遍历
二叉树遍历教学:理解三种递归遍历方式
一、二叉树的基本概念
1.二叉树是每个节点最多有两个子节点的树结构,称为:
左子树(left subtree) 右子树(right subtree)
2.五种基本形态:
-
空二叉树 只有根节点 只有左子树 只有右子树 完整的左右子树
二、二叉树的三种递归遍历
核心区别在于访问根节点的时机:
遍历方式 | 访问顺序 | 记忆口诀 |
---|---|---|
先序遍历 | 根 → 左 → 右 | 根左右 |
中序遍历 | 左 → 根 → 右 | 左根右 |
后序遍历 | 左 → 右 → 根 | 左右根 |
1. 先序遍历(Pre-order)
访问顺序:根节点 → 左子树 → 右子树
void preOrderTravl(int root) {if(root == 0) return; // 递归终止条件cout << tree[root].v << " "; // 1. 访问根preOrderTravl(tree[root].left); // 2. 遍历左子树preOrderTravl(tree[root].right); // 3. 遍历右子树 }
示例:
输入树:
A/ \B C/ \ \ D E F/ \ /G H I
输出:A B D E G H C F I
2. 中序遍历(In-order)
访问顺序:左子树 → 根节点 → 右子树
void inOrderTravl(int root) {if(root == 0) return;inOrderTravl(tree[root].left); // 1. 遍历左子树cout << tree[root].v << " "; // 2. 访问根inOrderTravl(tree[root].right); // 3. 遍历右子树 }
示例:
输入表达式树:
*/ \+ -/ \ / \ a b c d
输出:a + b * c - d
(中缀表达式)
3. 后序遍历(Post-order)
访问顺序:左子树 → 右子树 → 根节点
void postOrderTravl(int root) {if(root == 0) return;postOrderTravl(tree[root].left); // 1. 遍历左子树postOrderTravl(tree[root].right); // 2. 遍历右子树cout << tree[root].v << " "; // 3. 访问根 }
示例:
输入表达式树:
*/ \+ -/ \ / \ a b c d
输出:a b + c d - *
(后缀表达式/逆波兰式)
三、遍历的递归本质
所有遍历都遵循相同的递归框架:
void traverse(int root) {if(root == 0) return; // 递归基// 位置1:先序访问点traverse(左子树);// 位置2:中序访问点traverse(右子树);// 位置3:后序访问点 }
四、遍历的应用场景
遍历方式 | 典型应用场景 |
---|---|
先序遍历 | 复制二叉树、前缀表达式 |
中序遍历 | 二叉搜索树排序、中缀表达式 |
后序遍历 | 释放二叉树内存、后缀表达式计算 |
五、思考题
给定二叉树:
A/ \B C/ / \ D E F
请写出:
-
先序结果:
A B D C E F
-
中序结果:
D B A E C F
-
后序结果:
D B E F C A