2013-07-30 57 views
2

也許快/簡單的問題。我已經實現了二叉樹,然後我希望將二叉搜索樹轉換爲數組或至少將其打印出來,就好像在數組中一樣。我遇到問題的地方是如何獲得'/ 0'中的NULL /標誌。寬度第一遍遍二叉搜索樹C++

例如可以說我有像一棵樹:

   10 
      /\ 
       6 12 
      /\ \ 
      1 8 15 
      \ 
       4 

而且我希望它打印它應該如何打印。像:

 [10,6,12,1,8,\0,15,\0,4,\0,\0,\0,\0,\0,\0] 
     ^Something Like this^ I don't know if I counted the NULL correctly. 

或者對我多麼希望去了解顯示在視覺上我的樹是如何得到這樣的「/」和「\」指向來自父母的按鍵正確輸出的間距另一種選擇:

   10 
      /\ 
       6 12 
      /\ \ 
      1 8 15 
      \ 
       4 

這裏是什麼,我想詳細闡述代碼明智的,但即時通訊卡:

void BreadthFirstTravseral(struct node* root) 
{ 
    queue<node*> q; 

    if (!root) { 
     return; 
    } 
    for (q.push(root); !q.empty(); q.pop()) { 
     const node * const temp_node = q.front(); 
     cout<<temp_node->data << " "; 

     if (temp_node->left) { 
      q.push(temp_node->left); 
     } 
     if (temp_node->right) { 
      q.push(temp_node->right); 
     } 
    } 
} 

幫助或Link和或建議和或示例代碼的任何類型將是非常讚賞。

回答

4

這將是很難得到正確的間距作爲重點可能有多個數字,這應該不會影響間距給定節點以上的所有級別。

至於如何添加NULL - 只需添加else子句您IFS在那裏你打印一個NULL:

if (root) { 
    q.push(root); 
    cout << root->data << " "; 
} else { 
    cout << "NULL "; 
} 
while (!q.empty()) { 
    const node * const temp_node = q.front(); 
    q.pop(); 

    if (temp_node->left) { 
     q.push(temp_node->left); 
     cout << temp_node->left->data << " "; 
    } else { 
     cout << "NULL "; 
    } 


    if (temp_node->right) { 
     q.push(temp_node->right); 
     cout << temp_node->right->data << " "; 
    } else { 
     cout << "NULL "; 
    } 
} 
+2

While循環會不會永遠消失,因爲沒有任何東西會從q上彈出來?無限循環是我的計算機系統正在實現的。 –

+0

@Xaphen yeap謝謝。我忘了彈出。請立即修復此問題 –

0
void BreadthFirstTravseral(struct node* root) 
{ 
    queue<node*> q; 

    if (!root) { 
     return; 
    } 
    for (q.push(root); !q.empty(); q.pop()) { 
     const node * const temp_node = q.front(); 
     if(temp_node->special_blank){ 
      cout << "\\0 " ; 
      continue;//don't keep pushing blanks 
     }else{ 
      cout<<temp_node->data << " "; 
     } 
     if (temp_node->left) { 
      q.push(temp_node->left); 
     }else{ 
      //push special node blank 
     } 
     if (temp_node->right) { 
      q.push(temp_node->right); 
     }else{ 
      //push special node blank 
     } 
    } 
} 
+0

什麼是「special_blank」標識符? –

+0

您可以將節點添加到節點結構。如果不是特殊節點,它將爲假,否則爲真。這樣你可以捕獲特殊的空白節點並打印空的葉節點。 – jeremyvillalobos

0

如何:

std::vector<node*> list; 
list.push_back(root); 
int i = 0; 
while (i != list.size()) { 
    if (list[i] != null) { 
    node* n = list[i]; 
    list.push_back(n->left); 
    list.push_back(n->right); 
    } 
    i++; 
} 

沒有測試,但我認爲它應該工作。

0
void TreeBreadthFirst(Node* treeRoot) 
{ 
Queue *queue = new Queue(); 

     if (treeRoot == NULL) return; 
     queue->insert(treeRoot); 
     while (!queue->IsEmpty()) 
      {   
      Node * traverse = queue->dequeue(); 
     cout<< traverse->data << 「 「 ; 
      if (traverse->left != NULL) 
      queue->insert(traverse->left); 
      if (traverse->right != NULL) 
      queue->insert(traverse->right); 
      } 
     delete queue; 
     } 
+0

請在您的代碼中添加一些文檔。 – Max

0

我在c中製作了一個程序。此代碼將顯示爲有點像樹。

struct node{ 
    int val; 
    struct node *l,*r; 
}; 

typedef struct node node; 


int findDepth(node *t){ 
    if(!t) return 0; 
    int l,r; 
    l=findDepth(t->l); 
    r=findDepth(t->r); 

    return l>r?l+1:r+1; 
} 

void disp(node *t){ 
    if(!t) 
     return; 
    int l,r,i=0; 
    node *a[100],*p; 
    int front=0,rear=-1,d[100],dep,cur,h; 
    a[++rear]=t; 
    d[rear]=0; 
    cur=-1; 
    h=findDepth(t); 
    printf("\nDepth : %d \n",h-1); 

    while(rear>=front){ 
     dep = d[front]; 
     p=a[front++]; 
     if(dep>cur){ 
      cur=dep; 
      printf("\n"); 
      for(i=0;i<h-cur;i++) printf("\t"); 
     } 
     if(p){ 
      printf("%d\t\t",p->val); 
      a[++rear]=p->l; 
      d[rear]=dep+1; 
      a[++rear]=p->r; 
      d[rear]=dep+1; 
     } 
     else printf ("-\t\t"); 

    } 
} 
+0

爲代碼添加一些解釋並編輯您的答案。 – gsamaras