已知一顆二叉樹的層次遍歷序列和中序遍歷序列,建二叉樹過程(遞迴)
阿新 • • 發佈:2021-02-09
前面有寫過已知先序和中序的建樹過程,其實大概原理都差不多。
只不過層次遍歷序列比較特殊,它的結點、左子樹、右子樹不能一下看出。
中心思想:
通過中序序列找到根結點索引(根結點之前為左子樹,之後為右子樹),再從層次序列分別找到對應的左、右子樹(要注意按照層次序列的順序去找,程式碼中雙重迴圈處體現)。
#include <iostream>
#include <string.h>
#define type char
using namespace std;
typedef struct tree
{
type data; //結點資料
tree *l,*r; //左結點、右結點
}btree;
btree *create(type *layer,type *mid,int len)
{
if(len<=0)return NULL;
btree *p=new btree;
p->data=*layer;
int i,index;
for(i=0;i<len;i++)
if(*layer==mid[i])
{ index=i;break; //根結點索引
}
int j,k=0;
type t1[105];
//從層次遍歷序列找到左子樹存入一個新的陣列
for(i=0;i<len;i++) //此行與下一行順序不可調換
for (j=0;j<index;j++)
{ if(layer[i]==mid[j])
t1[k++]=layer[i];
}
t1[k]='\0'; //不寫沒影響
p->l=create(t1,mid,k); //建立左子樹
j=index+1,k=0;
type t2[105];
//從層次遍歷序列找到右子樹存入一個新的陣列
for(i=0;i<len;i++)
for(j=index+1;j<len;j++)
{ if(layer[i]==mid[j])
t2[k++]=layer[i];
}
t2[k]='\0'; //不寫沒影響
p->r= create(t2,mid+index+1,k); //建立右子樹
return p;
}
int main()
{
type *layer=new type[105];
type *mid=new type[105];
cin>>layer>>mid; //輸入層次、中序遍歷序列
btree *root=create(layer,mid,strlen(mid));
return 0;
}