数据结构 前序遍历结果 中序遍历结果确定二叉树

    在写的时候,突然想到 如果二叉树中有相同的字母 ,那么根据前序遍历与中序遍历的结果确定的二叉树可能会出错比如 前序遍历的结果为a a a,中序遍历的结果也为a a a,则对于这种情况建的二叉树可能不一样,但同样满足要求,

下面的程序是在二叉树中没有相同的字母出现,从而能唯一确定二叉树

// 树中各字符均不相同,否则有可能建的数不唯一
#include <iostream>
#include <string.h>
using namespace std;
class tree
{
    public:
    char c;
    tree *lchild,*rchild;
};
int main()
{
    void deal(string str_pretravel,string str_intravel,tree* &p);
    void Pretravel(tree *p);
    void Intravel(tree *p);
    int i,j,n,m,s,t;
    tree *head;
    string str_pretravel,str_intravel;
    cout<<"请输入前序遍历的结果:"<<endl;
    cin>>str_pretravel;
    cout<<"请输入中序遍历的结果:"<<endl;
    cin>>str_intravel;
    deal(str_pretravel,str_intravel,head);
    //遍历二叉树
    cout<<"前序遍历的结果为:"<<endl;
    Pretravel(head);      //前序遍历
    cout<<endl;
    cout<<"中序遍历的结果为:"<<endl;
    Intravel(head);        //非递归中序遍历
    cout<<endl;
    return 0;
}
void deal(string str_pretravel,string str_intravel,tree* &p)
{
    int i,j;
    string s1,s2;
    string s4,s5;
    int x,l1,l2;
    char s3[10000];
    if(str_pretravel.size()==0)
    {
        p=NULL;
        return ;
    }
    p=new(tree);
    p->c=str_pretravel[0];
    for( i=0,j=0;i<=str_intravel.size()-1;i++)
    {
        if(str_intravel[i]==str_pretravel[0])
        {
            break;
        }else
        {
            s3[j++]=str_intravel[i];
        }
    }
    s3[j]='\0';  s1=s3;
    l1=i;
    for(i=i+1,j=0;i<=str_intravel.size()-1;i++)
    {
        s3[j++]=str_intravel[i];
    }
    s3[j]='\0';
    s2=s3;
    for(i=1,j=0;i<=l1;i++,j++)
    {
        s3[j]=str_pretravel[i];
    }
    s3[j]='\0';
    s4=s3;
    for(i=l1+1,j=0;i<=str_pretravel.size()-1;i++)
    {
        s3[j++]=str_pretravel[i];
    }
    s3[j]='\0';
    s5=s3;
    deal(s4,s1,p->lchild);  deal(s5,s2,p->rchild);
}
void Pretravel(tree *p)
{
    if(p)
    {
        cout<<p->c;
        Pretravel(p->lchild);
        Pretravel(p->rchild);
    }
}
void Intravel(tree *p)
{
    tree *statck[100000];
    int top=0;
    while(p||top>0)
    {
        if(p)
        {
            statck[top++]=p;
            p=p->lchild;
        }else
        {
            p=statck[--top];
            cout<<p->c;
            p=p->rchild;
        }
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值