1. 程式人生 > >【劍指offer系列】 從上往下列印二叉樹___23

【劍指offer系列】 從上往下列印二叉樹___23

  題目描述:
  給定一棵二叉樹的根節點,按照從上往下的順序列印每一個節點,同一層的節點按照從左往右的順序列印
  
  示例:
  這裡寫圖片描述  
  
  分析:
  遇到這中涉及到二叉樹的層次問題的時候,利用佇列這種資料結構可以使問題變得非常簡單。
  首先將根節點加入佇列,然後從佇列頭部取出根節點。
  如果節點的左右孩子非空,則依次將其加入到佇列尾部。
  最終所有節點在佇列中的順序恰好是樹的層次遍歷的順序。  
  
  程式碼:      

void levelPrint(treeNode *root){
    if(root==NULL)   return
; queue<treeNode *> q; q.push(root); while(!q.empty()){ treeNode *t=q.front(); q.pop(); cout<<t->val<<endl; if(t->left) q.push(t->left); if(t->right) q.push(t->right); } }

  相關問題:
  1、Populating Next Right Pointers in Each Node (leetcode 116 & 117)

 
  若二叉樹中每個節點除了左右孩子節點指標外,還有一個next指標。
  請完成一個函式,實現將每個節點的next指標指向同一層中的右邊一個節點。若右邊沒有節點,則指向NULL
  
  示例:
  這裡寫圖片描述
  
  分析:
  這一題的做法與上一題基本相同,同樣利用佇列這一資料結構。不過我們可以在每一層遍歷完後向佇列中加入一個NULL指標,用於標識這一層的所有節點已經全部遍歷完
  
  程式碼:  

void connect(TreeLinkNode *root) {
        if(root==NULL)  return;
        queue<
TreeLinkNode *> q; q.push(root); q.push(NULL); TreeLinkNode *head=NULL; while(!q.empty()){ TreeLinkNode *t=q.front(); q.pop(); if(t){ if(t->left) q.push(t->left); if(t->right) q.push(t->right); }else{ if(!q.empty()) q.push(NULL); //為每一層的末尾加入一個NULL節點 } if(head){ head->next=t; //給每個節點的next指標賦值 head=head->next; }else{ head=t; } } }