二叉树

1.二叉树三种遍历
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<malloc.h>
#define error 0
#define ok    1
using namespace std;
typedef struct BiTNode{
    char data;
    BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int CreatBiTree(BiTree &T){
    char ch;
    ch=getchar();
    if(ch==' ') T=NULL;
    else {
        if(!(T=new BiTNode)) exit(error);
        T->data=ch;
        CreatBiTree(T->lchild);
        CreatBiTree(T->rchild);
    }
    return ok;
}
void out(char e){
    cout<<e<<" ";
}
void PreOrderTraverse(BiTree T){
    if(T){
        out(T->data);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
        return;
    }
    else return;
}
void InOrderTraverse(BiTree T){
    if(T){
        InOrderTraverse(T->lchild);
        out(T->data);
        InOrderTraverse(T->rchild);
        return;
    }
    else return;
}
void PostOrderTraverse(BiTree T){
    if(T){
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        out(T->data);
        return;
    }
    else return;
}
int main(){
    BiTree T;
    CreatBiTree(T);
    cout<<1<<endl;
    PreOrderTraverse(T);
    cout<<endl;
    InOrderTraverse(T);
    cout<<endl;
    PostOrderTraverse(T);
    cout<<endl;
    return 0;
}

2.给出两种遍历结果,求解另一遍历结果
(1)给出前、中序,求后序。
#include<iostream>
#include<malloc.h>
#define error 0
#define ok    1
using namespace std;
/*  中序必须已知
A B C D E G F
C B E G D F A
C G E F D B A
*/
typedef struct BiTNode{
    char data;
    BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void otherTraverse(string in,string pre,int i,int j,int len){
    if(len==0) return;

    char c=pre[j];
    int len2=0;

    for(len2;len2<len;len2++){
        if(in[i+len2]==pre[j]){
            break;
        }
    }
    otherTraverse(in,pre,i,j+1,len2);
    otherTraverse(in,pre,i+len2+1,j+len2+1,len-(len2+1));
    cout<<c;
    return;
}
int main(){
    string in,pre;
    cin>>pre>>in;
    otherTraverse(in,pre,0,0,pre.length());
    cout<<endl;
    return 0;
}

(2)给出中、后序,求前序
#include<iostream>
#include<malloc.h>
#define error 0
#define ok    1
using namespace std;
/*
A B C D E G F
C B E G D F A
C G E F D B A
*/
typedef struct BiTNode{
    char data;
    BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void otherTraverse(string in,string post,int i,int len1,int j,int len2){
    if(i>len1) return;
    char c=post[len2];
    int inw=i;

    for(inw;inw<=len1;inw++){
        if(in[inw]==post[len2]){
            break;
        }
    }
    cout<<c;
    if(len2==0) return;
    otherTraverse(in,post,i,inw-1,j,j+inw-1-i);
    otherTraverse(in,post,inw+1,len1,inw,len2-1);
    return;
}
int main(){
    string in,post;
    cin>>post>>in;
    int len=post.length();
    otherTraverse(in,post,0,len-1,0,len-1);
    cout<<endl;
    return 0;
}
/*
CGEFDBA
CBEGDFA
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值