概述
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
提示:
节点总数 <= 1000
解题思路:
使用层序遍历二叉树,奇数层则从队头先左后右打印,从队尾先左后右加入下层结点,偶数层则从队尾先右后左打印,从队头先右后左加入下层结点。
算法流程:
1.创建存储数组的数组res
2.如果树为空,返回res
3.创建双端队列q,并把树的根结点从队尾入队
4.循环直到队列为空
定义一个数组tmp
奇数层循环
定义结点node存储队头元素
node存入tmp,队头元素出队
把node的左孩子从队尾入队
把node的右孩子从队尾入队
把tmp存入res
如果队列为空,则跳出循环
把tmp清空
偶数层循环
定义结点node存储队尾元素
node存入tmp,队尾元素出队
把node的右孩子从队头入队
把node的左孩子从队头入队
把tmp存入res
5.返回res
代码:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(root==nullptr) return res;
deque<TreeNode*> q;
q.push_back(root);
while(!q.empty()) {
vector<int> tmp;
for(int i=q.size();i>0;i--) {
TreeNode* node=q.front();
tmp.push_back(node->val);
q.pop_front();
if(node->left!=nullptr)
q.push_back(node->left);
if(node->right!=nullptr)
q.push_back(node->right);
}
res.push_back(tmp);
if(q.empty()) break;
tmp.clear();
for(int i=q.size();i>0;i--) {
TreeNode* node=q.back();
tmp.push_back(node->val);
q.pop_back();
if(node->right!=nullptr)
q.push_front(node->right);
if(node->left!=nullptr)
q.push_front(node->left);
}
res.push_back(tmp);
}
return res;
}
};
运行步骤:
3
/
9 20
/
15 7
3入队
队列[3],node=3, 3出队,tmp:[3],
9,20入队,res:[[3]]
队列[9,20],node=20, 20出队
tmp:[20],7,15入队,
队列[9],node=20, 20出队
tmp:[20 9] res:[[3] [20 9]]
队列[15,7],node=15, 15出队
tmp:[15],队列[7],node=7, 7出队
tmp:[15,7],res:[[3] [20 9] [15 7]]
返回res:[[3] [20 9] [15 7]]
最后
以上就是威武香烟为你收集整理的之字型顺序打印二叉树(双端队列)的全部内容,希望文章能够帮你解决之字型顺序打印二叉树(双端队列)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复