好久没有刷题了。 最近大家都在刷题, 我不刷的话估计找不着工作了。
遇到了一个值得记录的easy题。
题本身很简单:
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 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
这种题以前我的做法就是每层最后在queue里面mark一下是不是这层结束,以便判断在最后return的array里面新建一个array。
但这次我不想这么做,觉得直接通过计算能得出什么时候进入了新的一层。
在第一层结束的时候推算出下一层的node总数是 2^depth = (1 << depth)
在queue里面null node不push进去
这样每层null的个数=上层null的个数*2 + 本层null的个数
这样这层应该处理的node个数就是 (1<<depth) – (lastLvlNull * 2 + thisLvlNull)
代码如下:
/** * 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) { if (root == NULL) return{}; queue<TreeNode *> q; q.push(root); int numNodeCurLvl = 1; int numNullNextLvl = 0; int numNullLastLvl = 0; int depth = 0; vector<vector<int> > res = { {} }; res[0].reserve(1); while (!q.empty()) { if (numNodeCurLvl == 0) { depth++; int totalNullCurLvl = numNullNextLvl + (numNullLastLvl << 1); numNodeCurLvl = (1 << depth) - totalNullCurLvl; numNullLastLvl = totalNullCurLvl; numNullNextLvl = 0; res.push_back(vector<int>()); res[depth].reserve(numNodeCurLvl); } TreeNode *curNode = q.front(); res[depth].push_back(curNode->val); if (!curNode->left) { numNullNextLvl++; } else { q.push(curNode->left); } if (!curNode->right) { numNullNextLvl++; } else { q.push(curNode->right); } q.pop(); numNodeCurLvl--; } return res; } };
逻辑上绝对没问题。。。
可是竟然没Accepted。。。
原因出在很长的长得像linked list的tree
[-150,null,-149,null,-148,null,-147,null,-146,null,-145,null,-144,null,-143,null,-142,null,-141,null,-140,null,-139,null,-138,null,-137,null,-136,null,-135,null,-134,null,-133,null,-132,null,-131,null,-130,null,-129,null,-128,null,-127,null,-126,null,-125,null,-124,null,-123,null,-122,null,-121,null,-120,null,-119,null,-118,null,-117,null,-116,null,-115,null,-114,null,-113,null,-112,null,-111,null,-110,null,-109,null,-108,null,-107,null,-106,null,-105,null,-104,null,-103,null,-102,null,-101,null,-100,null,-99,null,-98,null,-97,null,-96,null,-95,null,-94,null,-93,null,-92,null,-91,null,-90,null,-89,null,-88,null,-87,null,-86,null,-85,null,-84,null,-83,null,-82,null,-81,null,-80,null,-79,null,-78,null,-77,null,-7...
生成的结果应该是这样的
[[-150],[-149],[-148],[-147],[-146],[-145],[-144],[-143],[-142],[-141],[-140],[-139],[-138],[-137],[-136],[-135],[-134],[-133],[-132],[-131],[-130],[-129],[-128],[-127],[-126],[-125],[-124],[-123],[-122],[-121],[-120],[-119],[-118],[-117],[-116],[-115],[-114],[-113],[-112],[-111],[-110],[-109],[-108],[-107],[-106],[-105],[-104],[-103],[-102],[-101],[-100],[-99],[-98],[-97],[-96],[-95],[-94],[-93],[-92],[-91],[-90],[-89],[-88],[-87],[-86],[-85],[-84],[-83],[-82],[-81],[-80],[-79],[-78],[-77],[-76],[-75],[-74],[-73],[-72],[-71],[-70],[-69],[-68],[-67],[-66],[-65],[-64],[-63],[-62],[-61],[-60],[-59],[-58],[-57],[-56],[-55],[-54],[-53],[-52],[-51],[-50],[-49],[-48],[-47],[-46],[-45],[-44],[-43],[-42],[-41],[-40],[-39],[-38],[-37],...
也就是每个array只有一个node
我的生成前半部分都没问题,只有在-118这个node出了问题。
[-121],[-120],[-119],[-118,-117],[-116,-115],[-114,-113],[-112,-111],
突然有node合并在一个array里了。
逻辑上这个是绝对不可能发生的。。。
假设出问题的话那肯定是totalNullCurLvl这个var出了问题
所以我就print了一下, 结果大跌眼镜。。
totalNull: 1 totalNull: 3 totalNull: 7 totalNull: 15 totalNull: 31 totalNull: 63 totalNull: 127 totalNull: 255 totalNull: 511 totalNull: 1023 totalNull: 2047 totalNull: 4095 totalNull: 8191 totalNull: 16383 totalNull: 32767 totalNull: 65535 totalNull: 131071 totalNull: 262143 totalNull: 524287 totalNull: 1048575 totalNull: 2097151 totalNull: 4194303 totalNull: 8388607 totalNull: 16777215 totalNull: 33554431 totalNull: 67108863 totalNull: 134217727 totalNull: 268435455 totalNull: 536870911 totalNull: 1073741823 totalNull: 2147483647 totalNull: -1 totalNull: 0 totalNull: 2 totalNull: 6 totalNull: 14 totalNull: 30 totalNull: 62 totalNull: 126 totalNull: 254 totalNull: 510 totalNull: 1022 totalNull: 2046 totalNull: 4094 totalNull: 8190 totalNull: 16382
这个var在32层之后就跪了。原因就是depth 所在的node数超过int bit长度了!!!!
150-118=32 正好是32层出的问题。。
这样即使把var改成64位的long long也无济于事, 因为那顶多linked-list长度不能超过64层。。。
好吧 这算是涨经验了 具体解决办法我还没想出来
暂时用老方法重新写