二叉树的建立(输入先序和中序遍历后序)

【问题描述】

  已知二叉树的先序和中序遍历序列,推出它的后序遍历序列。

  输入: 共两行,第1行一一个字符串,表示树的先序遍历,第2行一个字符串,表示树的中序遍历。树的结点一律用小写字母表示。

  输出: 仅一行,表示树的后序遍历序列。

  【样例输入】

    abdec

    dbeac

  【样例输出】

    debca

 

复制代码
#include<iostream>
#include<cstring>
using namespace std;
char pre[101], mid[101]; 
int root=0, cnt=0,n; // 分别表示根节点的下标、编号和个数。 

struct node{
    char value; // 节点名称。
    int lchild, rchild; 
} data[101]; // 声明node类型的数组data。 

int create(int preL, int preR, int midL, int midR, int rt){
    if(preL>preR) return 0; // 递归的边界条件。
    rt=++cnt;
    // 找到每个根节点的位置index。 
    int index;
    for(int i=midL; i<=midR; i++){
        if(mid[i]==pre[preL]) {
            index=i;
            break;
        }
    } 
    data[rt].value=mid[index];
    int numLeft = index-midL;
    data[rt].lchild=create(preL+1, preL+numLeft, midL, index-1, rt);
    data[rt].rchild=create(preL+numLeft+1, preR, index+1, midR, rt);
    return rt;
} 

void rootPos(int rt){
    if(rt){
        rootPos(data[rt].lchild);
        rootPos(data[rt].rchild);
        cout<<data[rt].value;
    }
    return;
} 

int main(){
    cin>>pre>>mid;
    n=strlen(pre); 
    int root = create(0, n-1, 0, n-1, 0); // 分别传入先序和中序的左端元素和右端元素的下标与根节点的下标。
    rootPos(root);// 后序遍历输出:寻找节点的位置。 
    return 0;
} 
复制代码

 

复制代码
#include<iostream>
#include<cstring>
using namespace std;
// abdec  dbeac
char pre[101], mid[101];
int cnt=0; // 用于根节点累加器。 

struct node{
    char value;
    int lchild, rchild;
} data[101];

int create(int preL, int preR, int midL, int midR, int pos){
    if(preL>preR) return 0;
    pos=++cnt; // 如果preL<=preR,继续下一个结点。 
    // 判断每个树的根节点。
    int i;
    // 根据中序找到根节点。 
    for(i=midL; i<=midR; i++){
        if(pre[preL]==mid[i])
            break; // 找到根节点i后结束循环。 
    } 
    // 先序遍历: 根结点->左子树->右子树。 
    // 利用中序找到根节点并存储根节点元素。
    data[pos].value=mid[i];
    // 分根据先序规则分别递归(遍历)左子树和右子树。
    int numL=i-midL; // 计算左子树元素的个数。 
    // i-1: 中序数组的左子树的最后一个元素的下标。 
    data[pos].lchild=create(preL+1, preL+numL, midL, i-1, pos); 
    data[pos].rchild=create(preL+numL+1, preR, i+1, midR, pos); 
    return pos;
} 
// 后序遍历树操作。 
void rootNode(int pos){ 
    //如果当前根节点下标不为0,则依次按照左、右、根顺序递归(遍历)树的结点。
    if(pos){ 
        rootNode(data[pos].lchild); 
        rootNode(data[pos].rchild);
        cout<<data[pos].value;
    }
    return;
}

int main(){
    cin>>pre>>mid;
    // 获取字符串的长度,即结点的总个数。
    int n=strlen(pre);  
    // 调用create()创建结点并获取根节点的位置。
    // 依次传递先序和中序字符数组最左端、最右端的元素下标以及根节点的下标(先序的首元素的下标)。 
    int root=create(0,n-1,0,n-1,0); 
    rootNode(root); 
    return 0;
} 
复制代码

 

posted @   Hi,小董先生  阅读(310)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
历史上的今天:
2020-07-23 输出m到n之间的质数
点击右上角即可分享
微信分享提示