请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
从题目分析可知,题目的意思是:从上到下,单数行从左到右打印,双数行从右到左打印,这就需要我们在求解过程中要记住当前打印的是单数行还是奇数行。
考虑设置两个辅助栈空间,分别用于存放单数行的数据和双数行的数据,根据层序遍历的思想:遍历某一行时,可以直接将下一行的内容缓存,由此得到处理流程思路:
对上面这个二叉树:
初始化1入单行栈,1出栈时,需要将1按照左节点进栈、右节点进展的顺序,将其子节点压入双行栈,这样后续双行栈出栈时,出栈顺序为从右到左。
双行栈出栈时,同样边出栈,边将子节点入单行栈,但是入栈顺序是:先入右节点,再入左节点,这样后续单行栈出栈时,出栈顺序为从左到右。
class Solution { public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int>> res; if(pRoot == NULL) return res; stack<TreeNode*> s_single;//临时存放单层的数据 stack<TreeNode*> s_double;//临时存放双层的数据 //初始为1层 int layer = 1; s_single.push(pRoot); while(!s_single.empty() || !s_double.empty()){ //双层 if(layer%2 != 0){ vector<int> v_single; while(!s_single.empty()){ TreeNode* tmp = s_single.top(); v_single.push_back(tmp->val); s_single.pop(); if(tmp->left){ s_double.push(tmp->left); } if(tmp->right){ s_double.push(tmp->right); } } res.push_back(v_single); layer++; } //单层 else{ vector<int> v_double; while(!s_double.empty()){ TreeNode* tmp = s_double.top(); v_double.push_back(tmp->val); s_double.pop(); if(tmp->right){ s_single.push(tmp->right); } if(tmp->left){ s_single.push(tmp->left); } } res.push_back(v_double); layer++; } } return res; } };