二叉排序樹的樹形結構輸出
最近看資料結構看到了二叉排序樹,便照著書上的例子自己寫了個頭檔案。
但是書上沒有寫到如何將二叉排序樹輸出,便自己琢磨著寫了個,原始碼中負責輸出的部分程式碼如下:
template <typename T>
inline void BiSortTree<T>::OutPut()
{
int line=this->Depth();
bsTree<int> **ad=(bsTree<int>**)malloc(line*sizeof(bsTree<int>*)); //bsTree是二叉樹的一個節點,包含key,lchild,rchild,parent三項
for(int i=0;i<line;i++)
ad[i]=(bsTree<int>*)malloc(pow(2.0,i)*sizeof(bsTree<int>)); //ad[i]指向二叉排序樹的第i層,陣列ad[i]的長度為二叉排序樹第i層的長度
for(int i=0;i<line;i++)
for(int j=0;j<pow(2.0,i);j++)
{
ad[i][j].lchild=NULL;
ad[i][j].rchild=NULL;
ad[i][j].parent=NULL;
}
ad[0]->key=this->root->key; //root是一個指向bsTree的指標,作為二叉排序樹的根節點
ad[0]->lchild=this->root->lchild;
ad[0]->rchild=this->root->rchild;
ad[0]->parent=this->root->parent;
for(int i=1;i<line;i++) //這個迴圈就是將ad[i]層上的每個位置賦值,該層上的每個位置都是ad[i-1]層的lchild或rchild
for(int j=0;j<pow(2.0,i-1);j++)
{
if(ad[i-1][j].lchild!=NULL)
{
ad[i][2*j].key=ad[i-1][j].lchild->key;
ad[i][2*j].lchild=ad[i-1][j].lchild->lchild;
ad[i][2*j].rchild=ad[i-1][j].lchild->rchild;
ad[i][2*j].parent=&ad[i-1][j];
}
if(ad[i-1][j].rchild!=NULL)
{
ad[i][2*j+1].key=ad[i-1][j].rchild->key;
ad[i][2*j+1].lchild=ad[i-1][j].rchild->lchild;
ad[i][2*j+1].rchild=ad[i-1][j].rchild->rchild;
ad[i][2*j+1].parent=&ad[i-1][j];
}
}
for(int i=0;i<line;i++)
{
for(int k=0;k<pow(2.0,line-1-i)-1;k++)
cout<<" "; //打幾個空格,輸出時候整齊一些
for(int j=0;j<pow(2.0,i);j++)
{
if(ad[i][j].parent==NULL)
cout<<"-";
else
cout<<ad[i][j].key;
if(j!=pow(2.0,i)-1)
for(int k=0;k<pow(2.0,line-i)-1;k++)
cout<<" "; //也是為了輸出時候好看一些- -
}
cout<<endl;
}
}
思路大體上就是:假設有i層,則建立i個數組,第n個數組的長度是第n層的長度,ad[i][j]的值是指向二叉樹中對應位置的指標。寫好後功能是實現了,但是感覺佔用記憶體空間太大,效率也不是很高- -,大家有什麼好方法嗎,還望不吝賜教!謝謝啦!