狂自私

导航

二叉树的层次遍历

这么多的树相关的题目我都没有独立的完成过,叹自己太弱,一道一道的记录下来,这次是:二叉树的层次遍历

这次参考了维基百科的:树的遍历以及博客:[编程之美]二叉树的层次遍历

然后我参考之后写的代码:

 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  };

简直是两者的混合物,哎。路漫漫其修远兮,吾将上下而求索而得。

 

posted on 2018-06-10 10:45  狂自私  阅读(181)  评论(0编辑  收藏  举报