59、按之字形顺序打印二叉树 挺好的题目
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
示例1
输入
{8,6,10,5,7,9,11}
返回值
[[8],[10,6],[5,7,9,11]]
1、注意左右子树在两个栈中的入栈顺序
vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int>> result; if (pRoot == nullptr) return result; stack<TreeNode*> left_right_st; stack<TreeNode*> right_left_st; left_right_st.push(pRoot); while (left_right_st.size() || right_left_st.size()) { if (!left_right_st.empty()) { vector<int> temp; TreeNode* node; while (!left_right_st.empty()) { node = left_right_st.top(); temp.push_back(node->val); if (node->left)//这里先左再右 right_left_st.push(node->left); if (node->right) right_left_st.push(node->right); left_right_st.pop(); } result.push_back(temp); } if (!right_left_st.empty()) { vector<int> temp; TreeNode* node; while (!right_left_st.empty()) { node = right_left_st.top(); temp.push_back(node->val); if (node->right)//这里需要是先右再左 left_right_st.push(node->right); if (node->left) left_right_st.push(node->left); right_left_st.pop(); } result.push_back(temp); } } return result; }
2、稍微优化一下代码
vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int>> result; if (pRoot == nullptr) return result; stack<TreeNode*> left_right_st; stack<TreeNode*> right_left_st; left_right_st.push(pRoot); while (left_right_st.size() || right_left_st.size()) { vector<int> temp; TreeNode* node; if (!left_right_st.empty()) { while (!left_right_st.empty()) { node = left_right_st.top(); temp.push_back(node->val); if (node->left) right_left_st.push(node->left); if (node->right) right_left_st.push(node->right); left_right_st.pop(); } result.push_back(temp); } vector<int>().swap(temp); if (!right_left_st.empty()) { while (!right_left_st.empty()) { node = right_left_st.top(); temp.push_back(node->val); if (node->right) left_right_st.push(node->right); if (node->left) left_right_st.push(node->left); right_left_st.pop(); }