二叉树的操作

已知二叉树的前序和中序遍历,求后序遍历。

涉及到二叉树的一系列操作,当我输入EOF时程序没结束很郁闷,问了大神才知道,结束符要 control+Z 组合输出,get~

第一次自己主动写注释,感觉自己是个超级不称职的程序员。跟接口老师啥都没学会,唯独知道了匈牙利命名法。以后要规范。不以规矩不成方圆。

代码如下:

#include<stdio.h>
#include<string.h>
using namespace std;
struct Node{                 //树结点结构体
    Node *lchild;
    Node *rchild;
    char c;
}Tree[50];              //静态内存分配数组

int cnt;                //静态数组中已经分配的个数

Node *create(){         //申请一个结点空间,返回指向其的指针
    Tree[cnt].lchild=Tree[cnt].rchild=NULL;
    return &Tree[cnt++];
}

char str1[30],str2[30];  //保存前序。后序遍历结果

void postOrder(Node *T){ //后序遍历
    if(T->lchild!=NULL)
                postOrder(T->lchild);
    if(T->rchild!=NULL)
                postOrder(T->rchild);
    printf("%c",T->c);
}

Node *build(int s1,int e1,int s2,int e2){
                          //由前序遍历与中序遍历构造后序遍历,s1-e1,s2-e2
    Node *ret=create();
    ret->c=str1[s1];      //为该树根节点申请空间,字符为前序遍历第一个
    int rootIdx;
    for(int i=s2;i<=e2;i++){
        if(str2[i]==str1[s1]){
                rootIdx=i;
                break;
        }
    }
    if(rootIdx!=s2)       //左子树不为空
         ret->lchild=build(s1+1,s1+(rootIdx-s2),s2,rootIdx-1);
    if(rootIdx!=e2)       //右子树不为空
         ret->rchild=build(s1+(rootIdx-s2)+1,e1,rootIdx+1,e2);
    return ret;
}

int main(){
    while(scanf("%s",str1)!=EOF){
        scanf("%s",str2);
        cnt=0;            //初始化静态数组空间已经使用的结点数
        int l1=strlen(str1);
        int l2=strlen(str2);
        Node *T=build(0,l1-1,0,l2-1);    //还原整棵树,其根节点保存在T中
        postOrder(T);     //后序遍历
        printf("\n");
    }
    return 0;
}













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值