第十一週專案1-驗證演算法(2)二叉樹構造演算法的驗證
阿新 • • 發佈:2019-02-19
問題及程式碼:
/*
*煙臺大學計算機與控制工程學院
/*
*Copyright (c) 2015,煙臺大學計算機與控制工程學院
*All rights reserved.
*檔名稱:lulu.cpp
*作者:蘆亞茹
*完成日期:2015年11月16日
*版本號:v1.o
*
*問題描述:二叉樹構造演算法的驗證。
*/
由先序序列和中序序列構造二叉樹
由中序序列和後序序列構造二叉樹#include <stdio.h> #include <malloc.h> #include "btree.h" BTNode *CreateBT1(char *pre,char *in,int n) /*pre存放先序序列,in存放中序序列,n為二叉樹結點個數, 本演算法執行後返回構造的二叉鏈的根結點指標*/ { BTNode *s; char *p; int k; if (n<=0) return NULL; s=(BTNode *)malloc(sizeof(BTNode)); //建立二叉樹結點*s s->data=*pre; for (p=in; p<in+n; p++) //在中序序列中找等於*ppos的位置k if (*p==*pre) //pre指向根結點 break; //在in中找到後退出迴圈 k=p-in; //確定根結點在in中的位置 s->lchild=CreateBT1(pre+1,in,k); //遞迴構造左子樹 s->rchild=CreateBT1(pre+k+1,p+1,n-k-1); //遞迴構造右子樹 return s; } int main() { ElemType pre[]="ABDGCEF",in[]="DGBAECF"; BTNode *b1; b1=CreateBT1(pre,in,7); printf("b1:"); DispBTNode(b1); printf("\n"); return 0; }
由順序儲存結構轉為二叉鏈儲存結構#include <stdio.h> #include <malloc.h> #include "btree.h" BTNode *CreateBT2(char *post,char *in,int n) /*post存放後序序列,in存放中序序列,n為二叉樹結點個數, 本演算法執行後返回構造的二叉鏈的根結點指標*/ { BTNode *s; char r,*p; int k; if (n<=0) return NULL; r=*(post+n-1); //根結點值 s=(BTNode *)malloc(sizeof(BTNode)); //建立二叉樹結點*s s->data=r; for (p=in; p<in+n; p++) //在in中查詢根結點 if (*p==r) break; k=p-in; //k為根結點在in中的下標 s->lchild=CreateBT2(post,in,k); //遞迴構造左子樹 s->rchild=CreateBT2(post+k,p+1,n-k-1); //遞迴構造右子樹 return s; } int main() { ElemType in[]="DGBAECF",post[]="GDBEFCA"; BTNode *b2; b2=CreateBT2(post,in,7); printf("b2:"); DispBTNode(b2); printf("\n"); return 0; }
#include <stdio.h> #include <malloc.h> #include "btree.h" #define N 30 typedef ElemType SqBTree[N]; BTNode *trans(SqBTree a,int i) { BTNode *b; if (i>N) return(NULL); if (a[i]=='#') return(NULL); //當節點不存在時返回NULL b=(BTNode *)malloc(sizeof(BTNode)); //建立根節點 b->data=a[i]; b->lchild=trans(a,2*i); //遞迴建立左子樹 b->rchild=trans(a,2*i+1); //遞迴建立右子樹 return(b); //返回根節點 } int main() { BTNode *b; ElemType s[]="0ABCD#EF#G####################"; b=trans(s,1); printf("b:"); DispBTNode(b); printf("\n"); return 0; }