[笔记]: 二叉树 遍历转换

28 篇文章 0 订阅
25 篇文章 0 订阅

遍历命名
根据访问结点操作发生位置命名:
① NLR:前序遍历(Preorder Traversal 亦称(先序遍历))
——访问根结点的操作发生在遍历其左右子树之前。
(中 左 右)
② LNR:中序遍历(Inorder Traversal)
——访问根结点的操作发生在遍历其左右子树之中(间)。
(左 中 右)
③ LRN:后序遍历(Postorder Traversal)
——访问根结点的操作发生在遍历其左右子树之后。
(左 右 中)

1. 先,中序遍历转后序遍历
如:DBACEGF ABCDEFG
输出 ACBFGED

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace  std;
void solve(char *s,char *t){
    int i,k;
    char t2[100],s2[100];
    if(strlen(s)==1) printf("%s",s);
    else
    {
        k=strchr(t,s[0])-t;//找到根节点 
        if(k>0){//左子树
            strncpy(t2,t,k);
            t2[k]='\0';
            strncpy(s2,s+1,k);
            s2[k]='\0';
            solve(s2,t2);
        } 
        if(k<strlen(t)-1){//右子树
            strncpy(t2,t+k+1,strlen(t)-k-1);
            t2[strlen(t)-k-1]='\0';
            strncpy(s2,s+k+1,strlen(s)-k-1);
            t2[strlen(s)-k-1]='\0';
            solve(s2,t2);
        }
        printf("%c",t[k]);
    } 
}
int main(){
    char a[100],b[100];
    scanf("%s",a);
    scanf("%s",b);
    solve(a,b);
    return 0;
}

2.后,中续转先序

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace  std;
void solve(char *s,char *t){
    int i,k;
    char t2[100],s2[100];
    if(strlen(s)==1) printf("%s",s);
    else
    {
        k=strchr(t,s[0])-t;
        if(k>0){
            strncpy(t2,t,k);
            t2[k]='\0';
            strncpy(s2,s+1,k);
            s2[k]='\0';
            solve(s2,t2);
        } 
        if(k<strlen(t)-1){
            strncpy(t2,t+k+1,strlen(t)-k-1);
            t2[strlen(t)-k-1]='\0';
            strncpy(s2,s+k+1,strlen(s)-k-1);
            t2[strlen(s)-k-1]='\0';
            solve(s2,t2);
        }
        printf("%c",t[k]);
    } 
}
int main(){
    char a[100],b[100];
    scanf("%s",a);
    scanf("%s",b);
    solve(a,b);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值