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

来源:互联网 发布:网络用语略略什么意思 编辑:程序博客网 时间:2024/05/16 11:38

遍历命名
根据访问结点操作发生位置命名:
① 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;}
原创粉丝点击