【Open Judge二叉树】04:二叉树的遍历问题

 输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct BiNode
{
    char data;
    BiNode *lchild,*rchild;
};
void PostOrder(BiNode *root)
{
    if(root==NULL) return ;
    PostOrder(root->lchild);
    PostOrder(root->rchild);
    cout<<root->data;
}
int Search(char *pre,char *in,int len)
{
    for(int i=0;i<len;i++)
        if(pre[0]==in[i])
            return i;
    return -1;
}
BiNode *Build(char *pre,char *in,int len)//创建二叉树的过程
{
    if(len<=0)return NULL;//空结点
    BiNode *root=new BiNode;
    int qj=Search(pre,in,len);
    root->data=*pre;//每次都存前序遍历中区间内的第一个结点,即为根结点
//pre+1表示前序排列中左子树的根结点位置,in代表从in[0]开始为左子树,此处qj为左子树中结点总数。
    root->lchild=Build(pre+1,in,qj);

//同理。第一个位置表示前序排列中右子树根结点的位置,第二个元素表示从in[in+qj+1]开始为右子树。len-1-qj表示右子树中结点的总数。1是当前根结点本身,qj表示左子树中的结点数。
    root->rchild=Build(pre+qj+1,in+qj+1,len-1-qj);
    return root;//将创建好的当前结点返回;
}
int main()
{
    char *pre=new char[300],*in=new char [300];
    cin>>pre;cin>>in;
    BiNode *root=Build(pre,in,strlen(in));
    PostOrder(root);
}

思路:先找根结点,通过比对前序和中序字符串,划分出左子树和右子树,重复找根结点+划分两个步骤,直至当前根结点为空。创建出孩子结构清楚的前序遍历。

具体实现:利用二叉链表的结点表示方法。存储根节点(最开始的前序遍历的第一个元素),找根结点在中序遍历中的位置,确定左子树的结点个数(即根结点在中序排列中的下标减去前序排列中的下标,差值即是),然后递归创建左子树,递归创建右子树,最后返回根结点。

注意:在中序排列中搜索子树根结点的位置时,是在子树所在的区间搜索的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迎风809

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值