题解 | #按之字形顺序打印二叉树#
按之字形顺序打印二叉树
https://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0
/*
//缝缝补补了大半天,搞的代码,因为第一次使用嵌套的VECTOR,按照数组的逻辑来看已经不行了。
但是他们确实有相同之处,比如一个已知大小的vector<vector<int>> 类型的变量x可以通过auto p=x.begin(),
然后可以通过p[i][j],来读取任何一个该矩阵中的值,只是不想数组那样可以使用**p,因为本质上p是一个对象,
*p的返回值是vector<int>类型的对象,所以不能再解引用。虽然看起来变麻烦了,但也有变简单的部分,
就是可以不定义迭代器,往矩阵中增添元素。
2023/9/22
*/
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return int整型vector<vector<>>
*/
vector<vector<int> > Print(TreeNode* pRoot) {
//需要两个变量,一个整形变量,记录数的层数
//一个指针,指向该层数的最后一个变量。
//基数层数进入队列,偶数层数进入堆栈
// 1.0版本的失败,1.0需要一个堆栈和队列来解决,但是好像发现其实一个堆栈就行了
//只需要根据层数的基偶性来选择先push左节点还是右节点就行了。
int level=1,j=-1;
stack<TreeNode *> a1,a2;
vector<vector<int>> ab;
auto out=ab.begin();
////////以上为定义区////////
if(!pRoot)
return ab;
a1.push(pRoot);
while(!a1.empty()||!a2.empty())
{
///////////////////////////////////////////////////////////////////////////////
if(level%2==1) //在奇数层,上一层的顺序是从右往左
//基数是从左往右,先压右
{
ab.push_back(vector<int>());
while(!a1.empty())
{
if(a1.top()->left)
a2.push(a1.top()->left);
if(a1.top()->right)
a2.push(a1.top()->right);
ab.back().push_back(a1.top()->val);
a1.pop();
j++;
}
}level++;j=0;
///////////////////////////////////////////////////////////////////////////////
if(level%2==0)//上一层基数层是从左往右
//所以这层就要先压左
{
if(!a2.empty())
ab.push_back(vector<int>());
while(!a2.empty())
{
if(a2.top()->right)
a1.push(a2.top()->right);
if(a2.top()->left)
a1.push(a2.top()->left);
ab.back().push_back(a2.top()->val);
a2.pop();
j++;
}
}level++;j=0;
}
return ab;
}
};
OPPO公司福利 1137人发布