c++数据结构7——二叉树的遍历

二叉树遍历教学:理解三种递归遍历方式

一、二叉树的基本概念

1.二叉树是每个节点最多有两个子节点的树结构,称为:

左子树(left subtree)        右子树(right subtree)

2.五种基本形态:

                                                                     

  1. 空二叉树            只有根节点         只有左子树                只有右子树            完整的左右子树

二、二叉树的三种递归遍历

核心区别在于访问根节点的时机

遍历方式访问顺序记忆口诀
先序遍历根 → 左 → 右根左右
中序遍历左 → 根 → 右左根右
后序遍历左 → 右 → 根左右根
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

请写出:

  1. 先序结果:A B D C E F

  2. 中序结果:D B A E C F

  3. 后序结果:D B E F C A

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值