typedef struct BiTree{
struct BiTree* lchild;
struct BiTree* rchild;
int data;
}BiTree;
//根据先序和后序序列创建树
//char pre[] ={'0','a','b','c','d','e','f','g','h','i'};
//char in[] = {'0','b','c','a','e','d','g','h','f','i'};
void PreInCreat(BiTree* &root,char pre[],char in[],int l1,int h1,int l2,int h2)
//根据二叉树前序序列pre和中序序列in建立二叉树。l1,h1,l2,h2是序列第一和最后元素下标。
{
root = new BiTree(); //申请结点
root->data = pre[l1]; //pre[l1]是根
int i;
for(i=l2;in[i] != root->data;i++); //在中序序列中,根结点将树分成左右子树
int llen = i - l2;
int rlen = h2 - i;
if(llen == 0)
root->lchild = NULL; //无左子树
else
{
cout<<"left: "<<l1+1<<" "<<l1+llen<<" "<<l2<<" "<<l2+llen-1<<endl;
PreInCreat(root->lchild,pre,in,l1+1,l1+llen,l2,l2+llen-1);//递归建立左子树
}
if(rlen == 0)
root->rchild = NULL; //无右子树
else{
cout<<"right "<<h1-rlen+1<<" "<<h1<<" "<<h2-rlen+1<<" "<<h2<<endl;
PreInCreat(root->rchild,pre,in,h1-rlen+1,h1,h2-rlen+1,h2);//递归建立右子树
}
}
int main(int argc, const char * argv[]) {
BiTree* tree = NULL;
char pre[] ={'0','a','b','c','d','e','f','g','h','i'};
char in[] = {'0','b','c','a','e','d','g','h','f','i'};
PreInCreat(tree,pre, in, 1, sizeof(pre)/sizeof(char)-1, 1, sizeof(pre)/sizeof(char)-1);
preOrder(tree);
return 0;
}
根据存储在数组[1...n]的先序序列pre和中序序列in建立二叉树
最新推荐文章于 2022-10-17 10:14:13 发布