剑指32-1 从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回:
[3,9,20,15,7]
因为是要从上到下,所以要求先进先出,先压入的一层就要先输出,所以采用队列。
从第一层开始,先输出根节点的值,然后将左右子树压入队列(如果不为空)。
之后每一层,先记录下来队列的长度,即为这一层节点的数量,然后挨个弹出,对该层每个节点都输出值,然后压入左右子树(如果不为空)。因为已经提前记录了这一层节点数量,不会输出到下一层去。
注意处理根节点为空的情况。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<int> levelOrder(TreeNode* root) { 13 if(root==nullptr) 14 return {}; 15 queue<TreeNode*> q; 16 vector<int> ret; 17 ret.push_back(root->val); 18 if(root->left!=nullptr) 19 q.push(root->left); 20 if(root->right!=nullptr) 21 q.push(root->right); 22 while(!q.empty()){ 23 int cur_size=q.size(); 24 while(cur_size!=0){ 25 TreeNode* curptr=q.front(); 26 q.pop(); 27 cur_size--; 28 ret.push_back(curptr->val); 29 if(curptr->left!=nullptr) 30 q.push(curptr->left); 31 if(curptr->right!=nullptr) 32 q.push(curptr->right); 33 } 34 } 35 return ret; 36 } 37 };
经过思考发现,记录每一层数量其实完全是白用功,因为本题不用分层输出,直接顺序到下一层完全没影响。