【劍指offer系列】 從上往下列印二叉樹___23
阿新 • • 發佈:2019-01-24
題目描述:
給定一棵二叉樹的根節點,按照從上往下的順序列印每一個節點,同一層的節點按照從左往右的順序列印
示例:
分析:
遇到這中涉及到二叉樹的層次問題的時候,利用佇列這種資料結構可以使問題變得非常簡單。
首先將根節點加入佇列,然後從佇列頭部取出根節點。
如果節點的左右孩子非空,則依次將其加入到佇列尾部。
最終所有節點在佇列中的順序恰好是樹的層次遍歷的順序。
程式碼:
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;
}
}
}