考研数据结构(每日一题)day36

该博客介绍了如何通过先序序列转换得到满二叉树的后序序列。算法利用满二叉树的特性,通过递归的方式实现。首先找到根节点,然后分别对左子树和右子树进行递归转换。提供了具体代码实现,并进行了测试,展示转换后的后序序列。
摘要由CSDN通过智能技术生成

考研数据结构(每日一题)

题目:设有一棵满二叉树(所有结点值均不同),已知其先序序列为pre,求其后序序列post。

算法图解:

在这里插入图片描述

算法思想:

对于一般二叉树,仅仅根据先序或后序序列是不能确定另一个遍历序列。但对于满二叉树,任意一个结点的左右子树均有相同的结点数。

先序序列的第一个结点是后序序列的最后一个结点,由此可以得出先序序列pre[l1…h1]转化为后序序列post[l2…h2],运用递归,可得出递归模型为:

f(pre,l1,h1,post,l2,h2) = 不做任何事 h1<l1时 f(pre,l1,h1,post,l2,h2) =
post[h2] = pre[l1] 其他情况

中间位置:half=(h1-l1)/2

将pre[l1+1,l1+half]左子树转换为post[l2,l2+half-1],即f(pre,l1+1,l1+half,post,l2,l2+half-1)
将pre[l1+half+1,h1]右子树转换为post[l2+half,h2-1],即f(pre,l1+half+1,h1,post,l2+half,h2-1)

其中,post[h2]=pre[l1]表示后序系列的最后一个结点(根结点)等于先序序列的第一个结点(根结点)

完整代码:

void PreToPost(ElemType pre[],int l1,int h1,ElemType post[],int l2, int h2){
    int half;
    if(h1 >= l1){
        post[h2] = pre[l1];
        half = (h1 - l1) / 2;
        PreToPost(pre,l1 + 1,l1 + half,post,l2,l2 + half - 1);  //转换左子树
        PreToPost(pre,l1 + half + 1,h1,post,l2 + half,h2 - 1);  //转换右子树
    }
}

测试代码:

ElemType *pre = "ABCDEFG";
ElemType post[MaxSize];
PreToPost(pre,0,6,post,0,6);
printf("后序序列:");
for (int i = 0; i <= 6; i++)
{
    printf("%c",post[i]);
}
printf("\n");
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值