第一行以从左到右的顺序打印,第二层按照从右到左的顺序打印,以此类推。
主要的思路就是通过2个栈存储结点,若当前是二叉树的奇数层则从左到右存储,否则为从右到左存储。
vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int> > result; if(pRoot==nullptr) return result; stack<TreeNode*> level[2]; int cur=0,next=1; TreeNode* pNode; level[cur].push(pRoot); vector<int> vec; while(!level[0].empty()||!level[1].empty()) { pNode=level[cur].top(); level[cur].pop(); vec.push_back(pNode->val); if(cur%2==0) {//当层数是偶数时,子结点从左向右存入next栈中 if(pNode->left!=nullptr) level[next].push(pNode->left); if(pNode->right!=nullptr) level[next].push(pNode->right); } else {//当层数是奇数时,子结点从右向左存入next栈中 if(pNode->right!=nullptr) level[next].push(pNode->right); if(pNode->left!=nullptr) level[next].push(pNode->left); } //一层结点全部输出后,进入下一层 if(level[cur].empty()) { cur=1-cur; next=1-next; result.push_back(vec); vec.clear(); } } return result; }
关于在vector容器的使用上面,还发现有一种思路,就是使用队列存储结点,然后通过vector方法的
直接进行翻转操作来实现,不过这样会增加时间复杂度。也算是一种比较清晰的思路,代码也比较简短
reverse(vec.begin(), vec.end())