1. 程式人生 > >真題2006 完全二叉樹順序陣列轉化為二叉樹

真題2006 完全二叉樹順序陣列轉化為二叉樹

題目:一棵具有 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的右子樹
	} 
}