二叉树:已知先序遍历和中序遍历求后序遍历(同时也是华科某年上机题)

#include<bits/stdc++.h>
using namespace std;

/*已知先序和中序求后序*/
void transfer(char *preorder,char *inorder,int len)
{
    int i,left_len,right_len;//left_len,right_len分别表示每次找到根之后左右子树的节点个数
    left_len=right_len=0;
    char *p,*q;//q指向先序,p指向中序
    if(len==0)//长度为0就返回
        return;
    q=preorder;
    p=inorder;
    while(*p++!=*q)//循环结束时,说明找到了根的位置,然而此时的p指向根的后面一个元素因为++了,并且可以算出left_len,right_len
        left_len++;
    right_len=len-left_len-1;
    transfer(q+1*sizeof(char),inorder,left_len);//左子树递归
    transfer(q+(left_len+1)*sizeof(char),p,right_len);//右子树递归,注意这里的p不需要++,它已经指向刚才相等元素的后一个地址了,因为while语句中写的是*p++
    printf("%c",*q);//打印元素,在左右之后打印也符合后序遍历的特点吧
}

int main()
{
    char preorder[100],inorder[100];
    while(scanf("%s%s",preorder,inorder)!=EOF)
    {
        transfer(preorder,inor
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值