【数据结构笔记26】根据一棵树的先序/中序遍历Push与Pop内容,输出这棵树的先序、中序、后序遍历数组(不需要真的建立出树)

这篇博客介绍了如何根据二叉树的先序遍历Push和中序遍历Pop序列,不实际构建树的情况下,推导并输出先序、中序和后序遍历数组。通过分而治之和递归策略,解析先序和中序信息以生成后序遍历数组。博客提供了C语言的实现方案。
摘要由CSDN通过智能技术生成

本次笔记内容:
练习题-TTA.1 题意理解
练习题-TTA.2 核心算法

题意理解

先来回忆非递归中序遍历:

  • Push的顺序为先序遍历;
  • Pop的顺序给出中序遍历。

题意:根据一棵树的先序遍历Push与Pop内容,输出这棵树的先序、中序、后序遍历数组。

提示:不需要真正建立一棵树。

根据Push与Pop直接得出先序、中序数组

在这里插入图片描述

如上图右侧,6为数组长度,在程序实现中,定义两个数组pre(先序遍历数组)和in(中序遍历数组)。当然,还需要再开一个数组作为堆栈。

根据pre和in生成post

post用于记录后序数组。

  • 在先序遍历中,根结点一定是第一个被访问到的;
  • 在后序遍历中,根结点一定是最后一个被访问到的;
  • 因此post的最后一个元素就是pre的第一个元素,之后便可以分而治之。

在这里插入图片描述

如上图,可以通过中序遍历数组in来确定左右子树。这是一个分而治之的递归问题。

C实现

void solve(int preL, int inL, int postL, int n)
{
    if (n == 0)
        return;
    if (n == 1)
    {
        post[postL] = pre[preL];
        return;
    }
    // 上面的部分最后设计出,解决最小的case
    root = pre[preL];
    post[postL + n - 1] = root;
    for (i = 0; i < n; i++)
        if (in[inL + i] == root)
            break;                                    // 在in中找根结点
    L = i;                                            // 找到根结点后,左边有多少元素
    R = n - L - 1;                                    // 找到根结点后,右边有多少元素
    solve(preL + 1, inL, postL, L);                   // 左子树的元素头结点在各数组中的位置
    solve(preL + L + 1 +, inL + L + 1, postL + L, R); //右子树同理
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值