二叉树的层次遍历
这么多的树相关的题目我都没有独立的完成过,叹自己太弱,一道一道的记录下来,这次是:二叉树的层次遍历
这次参考了维基百科的:树的遍历以及博客:[编程之美]二叉树的层次遍历。
然后我参考之后写的代码:
1 static int x = []() { 2 ios::sync_with_stdio(false); // cin与stdin禁止同步 3 cin.tie(NULL); //cin与cout解除绑定 4 return 0; 5 }(); 6 class Solution { 7 public: 8 vector<vector<int>> levelOrder(TreeNode* root) { 9 vector<vector<int>> ret; 10 vector<int> temp; 11 TreeNode*p[1024] = { nullptr }; 12 int head = 0, tail = 0; 13 if (root) 14 { 15 temp.push_back(root->val); 16 ret.push_back(temp); 17 p[head] = root; //将节点的地址添加进去 18 tail++; //有尾部元素,所以tail自增,头部指标不变 19 } 20 else 21 { 22 return ret; 23 } 24 //在遍历当前层的时候,保存下一层的节点数,只需要每次插入一个节点的时候childSize++即可,这样我们就知道下一层有几个节点了, 25 //然后将childSize赋值给parentSize,开始新的一层遍历,从队列中取出parentSize个节点以后,也就知道这一层遍历完了。len为vector的size; 26 int parents_node_num = 1, child_node_num = 0, tag = tail, len = 1; 27 while (head < tail) 28 { 29 if (p[head]->left != nullptr) 30 { 31 p[tail] = p[head]->left; 32 temp.push_back(p[head]->left->val); 33 tail++; 34 child_node_num++; //下一层节点数+1 35 } 36 if (p[head]->right != nullptr) 37 { 38 p[tail] = p[head]->right; 39 temp.push_back(p[head]->right->val); 40 tail++; 41 child_node_num++; //下一层节点数+1 42 } 43 head++; 44 parents_node_num--; //预示着上一层的节点遍历完了一个 45 if (parents_node_num == 0) 46 { 47 temp.clear(); //每一次都要清空置零 48 parents_node_num = child_node_num; //上一层的节点已经遍历完成(head) 49 for (int i = tag; i < head + child_node_num; i++) 50 { 51 temp.push_back(p[i]->val); 52 } 53 ret.push_back(temp); 54 child_node_num = 0; 55 tag = tail; //标记起点 56 len++; 57 } 58 } 59 temp.clear(); 60 if (ret[len - 1] == temp) 61 { 62 ret.pop_back(); 63 } 64 return ret; 65 } 66 };
简直是两者的混合物,哎。路漫漫其修远兮,吾将上下而求索而得。