劍指offer(C++)——把二叉樹列印成多行

YF_Li123發表於2017-04-19

題目描述

從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。


/*
思路:對二叉樹進行層次遍歷,利用一個佇列來儲存將要列印的結點。為了把二叉樹的每一層結點單獨列印到一行,
需要設定兩個變數:一個表示當前層中還沒有列印的結點數(currentLevels),另一個表示下一層結點的數目(nextLevels)
*/
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};

class Solution {
public:
	vector<vector<int> > Print(TreeNode* pRoot) {
		vector<vector<int>> Value{};
		if (pRoot == NULL)
			return Value;
		queue<TreeNode* > queNode;
		queNode.push(pRoot);
		vector<int> subValue;                               //輔助陣列,儲存當前層所有的結點值
		int nextLevels = 0;                                 //用來統計下一層的結點數
		int currentLevels = 1;                              //用來標記當前層剩餘的沒有列印的結點數
		while (!queNode.empty())
		{
			TreeNode* pNode = queNode.front();
			queNode.pop();
			subValue.push_back(pNode->val);
			if (pNode->left != NULL)
			{
				queNode.push(pNode->left);
				++nextLevels;
			}
				
			if (pNode->right != NULL)
			{
				queNode.push(pNode->right);
				++nextLevels;
			}
			--currentLevels;
			if (currentLevels == 0)                             //如果當前層結點已全部列印完畢
			{
				Value.push_back(subValue);
				subValue.clear();                           //清空,開始存下一層結點
				currentLevels = nextLevels;                 //下一層要列印的結點數
				nextLevels = 0;                             //置0,開始統計下一層結點數
			}
		}
		return Value;
	}
};


相關文章