实验二 树
还原二叉树
关键算法思路:
1通过递归恢复二叉树,我们首先通过先序找到根,找到根节点在中序中的位置。因此跟的左边为其左子树,右边为其右子树。然后递归该根节点的左子树和右子树。
2通过递归求二叉树的深度,通过对根节点左子树和右子树的递归操作,分别得出左右子树的深度,比较得出最大值+1即为该树的深度。
#include <iostream>
#include <stack>
using namespace std;
typedef struct node{
char data;
struct node* lch;
struct node* rch;
}Node;
int findIndex(char p,char* mid){
int i;
for(i-0;*(mid+i)!='\0';i++){
if(p==*(mid+i))
return i;
}
return 0;
}
void ReturnTree(Node** root,char firstOrder[],char midOrder[]){
static int cnt=0;
int midindex=findIndex(firstOrder[cnt],midOrder);
*root=new Node();
(*root)->data=firstOrder[cnt];
firstOrder[cnt++]='\0';
midOrder[midindex]='\0';
if(midOrder[midindex-1]!='\0'){
ReturnTree(&((*root)->lch),firstOrder,midOrder);
}
else{
(*root)->lch=NULL;
}
if(midOrder[midindex+1]!='\0'){
ReturnTree(&((*root)->rch),firstOrder,&midOrder[midindex+1]);
}
else {
(*root)->rch=NULL;
}
}
int treeDepth(Node* root){
int h,lh,rh;
if(root==NULL) h=0;
else
{
lh=treeDepth(root->lch);
rh=treeDepth(root->rch);
if(lh>=rh) h=lh+1;
else
{
h=rh+1;
}
}
return h;
}
int main(){
int n;
cin>>n;
char firstOrder[n+1],midOrder[n+1];
cin>>firstOrder;
cin>>midOrder;
Node* root;
ReturnTree(&root,firstOrder,midOrder);
int h=treeDepth(root);
cout<<h<<endl;
system("pause");
}