1. 程式人生 > 其它 >已知一顆二叉樹的層次遍歷序列和中序遍歷序列,建二叉樹過程(遞迴)

已知一顆二叉樹的層次遍歷序列和中序遍歷序列,建二叉樹過程(遞迴)

前面有寫過已知先序和中序的建樹過程,其實大概原理都差不多。
只不過層次遍歷序列比較特殊,它的結點、左子樹、右子樹不能一下看出。

中心思想:
通過中序序列找到根結點索引(根結點之前為左子樹,之後為右子樹),再從層次序列分別找到對應的左、右子樹(要注意按照層次序列的順序去找,程式碼中雙重迴圈處體現)。

在這裡插入圖片描述

#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; }