《从头再来》剑指offer.32III 从上到下打印二叉树
作者:互联网
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
由于需要对偶数层的节点进行反向输出,所以我们想到借助双端队列来完成反向的操作。其他的操作和前两题没什么区别,主要的区别就是奇数层和偶数层对于双端队列来说入队的位置不同,不只入队的顺序不同,并且左右子节点的入队顺序也不同。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> result; if(root == nullptr) return result; //借助双端队列 deque<TreeNode*> deq; deq.push_back(root);//先将根结点加入队列 int level_number = 2;//从第二层开始 while(!deq.empty()){ int count = deq.size(); vector<int> level; while(count != 0){ if(level_number%2 == 0){ //偶数层,从后取上层节点,然后将本层节点从前面压入(偶数层先压左节点) TreeNode* node = deq.back(); level.push_back(node->val); deq.pop_back();//从后取从后出队列 count--; if(node->left != nullptr) deq.push_front(node->left); if(node->right != nullptr) deq.push_front(node->right); } if(level_number%2 == 1){ //奇数层,从前取上层节点,然后将本层节点从后面压入(奇数层先压右节点) TreeNode* node = deq.front(); level.push_back(node->val); deq.pop_front();//从前取从前出队列 count--; if(node->right != nullptr) deq.push_back(node->right); if(node->left != nullptr) deq.push_back(node->left); } } level_number++; result.push_back(level); } return result; } };
多画图理解一下偶数层和奇数层的入队方式。
《从头再来》
标签:node,从头再来,level,deq,back,二叉树,push,TreeNode,offer.32 来源: https://www.cnblogs.com/azie420/p/14860090.html