演算法驗證-二叉樹構造演算法
阿新 • • 發佈:2019-01-27
/*
* Copyright (c) 2017,煙臺大學計算機學院
* All right reserved.
* 檔名稱:main.cpp
* 作者:於嵩
* 完成日期:2017年11月7日
* 版本號:v1.0
*
* 問題描述:二叉樹演算法驗證
* 輸入描述:標準函式輸入
* 程式輸出:標準函式輸出
*/
1.由先序序列和中序序列構造二叉樹
執行結果:#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; }
2.由後序序列和中序序列構造二叉樹
執行結果:#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; }
3.由順序儲存結構轉為二叉鏈儲存結構
執行結果:#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; }