leecode 解题总结:102. Binary Tree Level Order Traversal

来源:互联网 发布:咋用密码登录mysql 编辑:程序博客网 时间:2024/06/16 04:33
#include <iostream>#include <stdio.h>#include <vector>#include <queue>using namespace std;/*问题:Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).For example:Given binary tree [3,9,20,null,null,15,7],    3   / \  9  20    /  \   15   7return its level order traversal as:[  [3],  [9,20],  [15,7]]分析:实际上就是层序遍历,按层输出。层序遍历最好用队列来做。队列每当遍历到一个结点的时候,会把下面一层的结点填充一部分,那么问题的关键就在于如何知道当前层的结尾。需要知道何时从新的一层遍历,遍历几次后当前层遍历结束以下面这棵树举例:    3   / \  9  20    /  \   15   7设当前层结点个数为size,下一层结点个数为nextSize=0队列压入根节点,并设置根节点size=1.弹出当前结点,根节点3有两个孩子,压入两个孩子,设置nextSize += 2变为2, size--,size变成0,令size = nextSize = 2,nextSize=0弹出结点9,size-- 后变为1,nextSize += 结点9的孩子0个 变为0,弹出结点20,将结点20的两个孩子压入队列,size--后变为0,nextSize += 2 变为2,然后令size = nextSize, nextSize = 0弹出结点15,size--后变为1,nextSize += 0 变为0,弹出结点7,size--后变为0,nextSize += 0变为0,此时队列为空,结束关键:1 总结过程:每弹出一个结点,将该结点压入结果集,压入该结点的孩子到队列,然后更新下一层结点个数,并使得当前层个数累减,如果减为0,令当前层个数=下一层个数,并使得下一层个数清零,将当前层结果集保存在最终结果集中*/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>> results;        if(NULL == root){return results;}queue<TreeNode*> nodes;nodes.push(root);int size = 1;int nextSize = 0;vector<int> result;TreeNode* node = NULL;while(!nodes.empty()){node = nodes.front();nodes.pop();result.push_back(node->val);if(node->left){nodes.push(node->left);nextSize += 1;}if(node->right){nodes.push(node->right);nextSize += 1;}size--;if(0 == size){size = nextSize;nextSize = 0;vector<int> tempResult(result);results.push_back(tempResult);result.clear();}}return results;    }};void print(vector<int>& result){if(result.empty()){cout << "no result" << endl;return;}int size = result.size();for(int i = 0 ; i < size ; i++){cout << result.at(i) << " " ;}cout << endl;}void process(){ vector<int> nums; int value; int num; Solution solution; vector<int> result; while(cin >> num ) { nums.clear(); for(int i = 0 ; i < num ; i++) { cin >> value; nums.push_back(value); } }}int main(int argc , char* argv[]){process();getchar();return 0;}

0 0