牛客网剑指offer第59题——按之字形顺序打印二叉树
题目:
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路:这个题目是典型的按行打印二叉树,但是不同于之前都是从左至右打印那种顺序(都是从左至右的是使用栈)。这个题目的本质是:下一次的打印都是倒叙的,基于这个特征,我们定义两个栈:一个栈用于存储奇数行节点,一个栈用于存储偶数行节点。
比如我们在打印第一行的节点时(stack1出栈),将第二行按照从左至右的顺序入栈(stack2入栈);那么当我们打印第二行的时候(stack2出栈),就是从右至左的顺序打印;当我们从右至左打印第二行的时候,将关联的第三行子节点从右至左入栈(stack1入栈),则当我们打印第三行时(stack1出栈),就又是从左至右的顺序.....
代码:
/* 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; //用双栈的思路能够清晰的解决这个问题: if(pRoot == nullptr) return res; stack<TreeNode*> odd_level;//stack1 stack<TreeNode*> even_level;//stack2 odd_level.push(pRoot); while((!odd_level.empty()) || (!even_level.empty())) { if(!odd_level.empty()) { vector<int> midres; while(!odd_level.empty()) { TreeNode*topNode = odd_level.top(); odd_level.pop(); midres.push_back(topNode->val); if(topNode->left != nullptr) even_level.push(topNode->left); if(topNode->right != nullptr) even_level.push(topNode->right); } res.push_back(midres); } else if(!even_level.empty()) { vector<int> midres; while(!even_level.empty()) { TreeNode*topNode = even_level.top(); even_level.pop(); midres.push_back(topNode->val); if(topNode->right != nullptr) odd_level.push(topNode->right); if(topNode->left != nullptr) odd_level.push(topNode->left); } res.push_back(midres); } } return res; } };
stay foolish,stay hungry