【劍指Offer】按之字形順序打印二叉樹:,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。

題目描述

請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。

思路

開始是參照二叉樹層次遍歷,在其中加了個棧進行之字遍歷輸出,後來發現有問題,將隊列也改成棧之後就正確了.

設出兩個棧:
stack<TreeNode*>mys1;//左右存
stack<TreeNode*>mys2;//右左存

mys1 存儲奇數層,每次從左孩子到右孩子壓棧,

mys2存儲偶數層,每次從右孩子到左孩子壓棧。

當mys1.pop 的時候是給mys2進行壓棧,當mys1爲空的時候對mys2進行pop,對mys1進行壓棧,這樣交替入棧出棧,便可完成按之字形順序打印二叉樹。

代碼

/*
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>>res;
		stack<TreeNode*>mys1;//左右存
		stack<TreeNode*>mys2;//右左存
		TreeNode* ptr = nullptr;
		if (pRoot == nullptr)
			return res;
		mys1.push(pRoot);
		while (!mys1.empty() || !mys2.empty()) {
			vector<int>tmp;
			while (!mys1.empty()) {
				ptr = mys1.top();
				mys1.pop();
				tmp.push_back(ptr->val);
				if (ptr->left != nullptr)
					mys2.push(ptr->left);
				if (ptr->right != nullptr)
					mys2.push(ptr->right);
			}
			if (!tmp.empty()){
				res.push_back(tmp);
				tmp.clear();
			}
			while (!mys2.empty()) {
				ptr = mys2.top();
				mys2.pop();
				tmp.push_back(ptr->val);
				if (ptr->right != nullptr)
					mys1.push(ptr->right);
				if (ptr->left != nullptr)
					mys1.push(ptr->left);
			}
			if (!tmp.empty()) {
				res.push_back(tmp);
				tmp.clear();
			}
		}
		return res;
	}   
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章