真題2006 完全二叉樹順序陣列轉化為二叉樹
阿新 • • 發佈:2018-12-18
題目:一棵具有 n 個結點的完全二叉樹以順序方式儲存在陣列 A 中。設計一個演算法構造該二叉樹的二叉鏈儲存結構。 解:對於以順序方式儲存在陣列 A(其大小為 MaxSize,下標從0開始)中的一棵完全二叉樹,結點 A[i]的左孩子為 A[2i+1],右孩子為 A[2i+2]。
void Ctree(BTNode &t, ElemType A[], int i) { //加工型 if (i>=MaxSize || A[i]==' ') //若 i 無效或 A[i]為無效結點 t=NULL; else { t=(BTNode *)malloc(sizeof(BTNode)); //二叉樹空間的初始分配 t->data=A[i]; //使二叉樹t儲存著陣列元素 Ctree(t->lchild,A,2*i+1); //遞迴構造*t 的左子樹 Ctree(t->rchild,A,2*i+2); //遞迴構造*t 的右子樹 } }
題目:設計一個演算法,將一棵以二叉鏈方式儲存的二叉樹 t 按順序方式儲存到陣列 A 中。 解:由二叉樹的順序儲存方式可知本題的遞迴模型f()如下: f(t,A,i):當 t==NULL ,此時A[i]=’ '; f(t,A,i):當 t!=NULL, 由t 結點 data 域值建立 A[i]元素; 其他情況 f(t->lchild,A,2i+1); f(t->rchild,A,2*i+2) 呼叫方式為:f(t,A,0)(A 的下標從0 開始)。
void Ctree(BTNode *t,char A[],int i) //引用型操作 { if (t==NULL) A[i]=' '; //不做任何事,遞迴出口 else { A[i]=t->data; //使陣列A中儲存著二叉樹元素 Ctree(t->lchild,A,2*i+1); //繼續儲存t的左子樹 Ctree(t->rchild,A,2*i+2); //繼續儲存t的右子樹 } }