1. 程式人生 > >二叉排序樹的樹形結構輸出

二叉排序樹的樹形結構輸出

最近看資料結構看到了二叉排序樹,便照著書上的例子自己寫了個頭檔案。

但是書上沒有寫到如何將二叉排序樹輸出,便自己琢磨著寫了個,原始碼中負責輸出的部分程式碼如下:

 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]的值是指向二叉樹中對應位置的指標。寫好後功能是實現了,但是感覺佔用記憶體空間太大,效率也不是很高- -,大家有什麼好方法嗎,還望不吝賜教!謝謝啦!