劍指Offer——從上往下打印二叉樹

題目描述

從上往下打印出二叉樹的每個節點,同層節點從左至右打印。

解題思路

本題需要藉助隊列來完成,每一次打印一個結點的時候,如果該結點有子節點,把該結點的子節點放到隊列的尾。接下來到隊列的頭部取出最早進入隊列的結點,重複前面打印操作,直到隊列中所有的結點都被打印出爲止。

以如下二叉樹爲例:

1                  8
2                /  \
3               6   10
4              / \  / \
5             5  7 9  11

解題步驟如下:

  1. 設置一個隊列,將根節點加入隊列。每次循環開始,首先從隊頭取出一個節點,將該節點的數據值放入res(最後返回的vector)。同時將該節點的左右子結點加入隊列。對應上述二叉樹,具體過程如下:
  2. 首先將根節點放入隊列。循環開始,從隊頭取出一個節點(即根節點8),將該節點的值放入res,然後將該節點的左右子結點加入隊列,即6和10;
  3. 從隊頭取出節點6,將6放入res,同時加入節點6的左右節點(5和7)到隊列尾,此時隊列中節點爲10、5、7;
  4. 從隊頭取出節點10,將10放入res,同時加入節點10的左右節點到隊尾,此時隊列節點爲5、7、9、11;
  5. 此時取出隊頭節點5,將5放入res,同時加入節點5的左右節點NULL到隊尾(由於加入了NULL到隊列中,在隊列中取出節點是,如果遇到NULL,直接continue繼續循環即可);
  6. 重複上述過程直到隊列中元素全部取出後,遍歷完成。

代碼

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    vector<int> PrintFromTopToBottom(TreeNode* root) {
        vector<int> res;
        if( root == NULL )
            return res;
        queue<TreeNode*> q;
        q.push( root );
        while( !q.empty() )
        {
            TreeNode* temp = q.front();
            q.pop();
            if( temp == NULL )
                continue;
            res.push_back(temp->val);
            q.push(temp->left);
            q.push(temp->right);
        }
        return res;
    }
};
發佈了52 篇原創文章 · 獲贊 54 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章