二叉树前序: 根 - > 左 - > 右 前序给出的第一个节点为根节点
二叉树中序: 左 - > 根 - > 右 中序可以在前序的基础上将树的左孩子,右孩子,完全确定。 下面就是一个递归的过程
每次递归过程中 拿当前传入的前序遍历的首节点 找到中序遍历的该首节点的位置。并将其划分为左右两个子树。并链接在结构体指针上
#include <iostream>
#include <stdio.h>#include <stdlib.h>
using namespace std;
#define Maxn 50
typedef struct Treenode* BinTree;//重新命名,typedef 即便之前未声明 Treenode 结构体,编译器不会检查语法问题。
struct Treenode
{
char Data;
BinTree Left; //指向左孩子的结构体指针
BinTree Right; //指向右孩子的结构体指针
};
BinTree CreateBinTree (char *Pre,char *In,int len)
{
BinTree T;
int i;
if(!len)
{
return NULL;
}
T=(BinTree)malloc(sizeof(struct Treenode));
T->Data=Pre[0];
for(i=0;i<len;i++) //从中序遍历中,找到当前传入的前序遍历的头节点(递归后仍然相同)。
{
if(Pre[0]==In[i])
break;
}
T->Left=CreateBinTree(Pre+1,In,i); // 递归: 完全建立根节点的左子树
T->Right=CreateBinTree(Pre+i+1,In+i+1,len-i-1); // 递归: 完全建立根节点的右子树
return T;
}
int Height(BinTree T)
{
int Theigth,Lheight,Rheight;
if(!T)
Theigth =0;
else
{
Lheight=Height(T->Left); //求出根节点左子树的最大高度
Rheight=Height(T->Right); // 求出根节点右子树的最大高度Theigth=(Lheight>Rheight)?Lheight:Rheight;
Theigth++;
}
return Theigth;
}
int main()
{
int N;
char Pre[Maxn+1],In[Maxn+1];
BinTree T=NULL;
scanf("%d",&N);
scanf("%s\n%s",Pre,In); // 给出前中序
T=CreateBinTree(Pre,In,N); //构建二叉树,用结构体指针T来接收。
cout<<Height(T); // 检测树高,确定二叉树正确建立(层序也可);
return 0;
}