前序和中序创建二叉树(C语言)
#include<stdio.h>
#include<stdlib.h>
typedef struct BNode{
int data;
BNode* lchild;
BNode* rchile;
}BNode,*BTree;
BTree CreateTree(int Pre[],int In[],int start1,int end1,int start2,int end2);
int TreeHeight(BTree T);
int main(){
int N;
printf("请输入节点数");
scanf("%d",&N);
int Pre[N];
int In[N];
int i;int j;
printf("请输入先序序列:");
for(i = 0;i < N;i++){
scanf("%d",&Pre[i]);
}
printf("请输入中序序列:");
for(j = 0;j < N;j++){
scanf("%d",&In[j]);
}
BTree T = CreateTree(Pre,In,0,N-1,0,N-1);
printf("%d",TreeHeight(T));
return 0;
}
//前序和中序创建二叉树
BTree CreateTree(int Pre[],int In[],int start1,int end1,int start2,int end2){
BTree T = (BTree)malloc(sizeof(BNode));
T->data = Pre[start1];
int k;//在中序中找这个数
for(k = start2;In[k] != T->data;k++);
int llen = k - start2;
int rlen = end2 - k;
if(llen > 0){
T->lchild = CreateTree(Pre,In,start1 + 1,start1 + llen,start2,k - 1);
//T->lchild = CreateTree(Pre,In,start1 + 1,start1 + llen,start2,start2 + llen - 1);
}
else{
T->lchild = NULL;
}
if(rlen > 0){
T->rchile = CreateTree(Pre,In,end1 - rlen + 1,end1,k + 1,end2);
//T->rchile = CreateTree(Pre,In,end1 - rlen + 1,end1,end2 - rlen + 1,end2);
}
else{
T->rchile = NULL;
}
return T;
}
int TreeHeight(BTree T){
if(!T){
return 0;
}
int left = TreeHeight(T->lchild) + 1;
int right = TreeHeight(T->rchile) + 1;
if(left > right){
return left;
}
if(left < right){
return right;
}
}
代码的这个递归的地方两个方法都可以,因为i是在中序中找出来的,不可以把i运用到前序中去(在中序找的In[i]和Pre[i]是不一样的)