二叉树的遍历问题
作者:互联网
题目:二叉树遍历
问题描述
给定一棵二叉树的先序遍历和中序遍历序列,求其后序遍历序列。
输入格式
输入数据有两行,为两个字符串,其长度n均小于等于26。第一行为先序遍历序列,第二行为中序遍历序列。
二叉树中的结点名称以大写字母表示:A,B,C…最多26个结点。
输出格式
在一行上输出后序遍历序列。
样例输入1
ABC
BAC
样例输出1
BCA
样例输入2
ABDFGHIEC
FDHGIBEAC
样例输出2
FHIGDEBCA
主要思路
这种用先序和中序序列作为建树依据来求其后续输出或者求树高的问题,难点往往在于如何建树。其实了解了先序中序的遍历规则,题目就不难了。
先序序列的第一个元素时树的根,这是首先可以确定的,然后我们需要在中序序列中找到该元素并记录它所在的位置,根据中序序列遍历的特性,得到它前面的元素是树的左子树,后面的元素是树的右子树。并以此作为依据,递归下去,这样一棵树就建好了。 后面的求后续遍历序列或者树高的函数我相信大家应该都会,就不详细说明其思路了,我们直接看代码。
代码实现
#include <bits/stdc++.h>
using namespace std;
typedef struct node{
char data;
struct node *lchild,*rchild;
}Node,*BinTree;
char pre[50],in[50]; //先序序列数组和后序序列数组
BinTree createTree(int preL,int preR,int inL,int inR){
if(preL > preR) //递归结束
return NULL;
BinTree root=(BinTree)malloc(sizeof(Node));
char tou=pre[preL];
root->data=tou; //每一次递归所建的树根都等于先序数组的第一个元素
int i;
for(i=inL;i<inR;i++){ //在中序序列中找到这个元素
if(in[i]==tou) //这个元素的下标为i
break;
}
int lnum=i-inL; //中序序列的到树的左子树个数为i-inL
root->lchild=createTree(preL+1,preL+lnum,inL,i-1);
//这边挺难理解的,preL+1表示递归所建立的树的先序左区间为树根之后的
//一个元素下标,右区间为树根下标加上前面得到的左子树个数
//自己画个图标个下标就很好理解,下面右子树的建立也是同样的道理
//多理解多写,形成肌肉记忆
root->rchild=createTree(preL+lnum+1,preR,i+1,inR);
return root;
}
void houxu(BinTree T){ //后续遍历不多解释
if(T){
houxu(T->lchild);
houxu(T->rchild);
printf("%c",T->data);
}
}
int GetHeight(BinTree T){ //求树高,题目没要求,我额外加的,
//pta上的是这个,也不难
int l_height,r_height,height;
if(T){
l_height=GetHeight(T->lchild);
r_height=GetHeight(T->rchild);
if(l_height > r_height)
height=l_height+1;
else
height=r_height+1;
}
return height;
}
int main(){
scanf("%s",pre);
scanf("%s",in);
int len1=strlen(pre);
int len2=strlen(in);
BinTree T=createTree(0,len1-1,0,len2-1);
houxu(T);
printf("\n%d",GetHeight(T));
return 0;
}
标签:遍历,int,中序,height,问题,二叉树,序列,先序 来源: https://blog.csdn.net/lbwnbnbnbnbnbnbn/article/details/121872939