LeetCode面试题 04.03. 特定深度节点链表
题目:
给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。
示例:
输入:[1,2,3,4,5,null,7,8]
复制代码
1
2
3
4
5
6
7
81 / 2 3 / 4 5 7 / 8
输出:[[1],[2,3],[4,5,7],[8]]
题解:
经典的BFS题,将每一次层序遍历的结果存入一个链表然后存入链表型的vector里,最后返回该vector。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27class Solution { public: vector<ListNode*> listOfDepth(TreeNode* tree) { if(!tree) return vector<ListNode*>();//空树判断 vector<ListNode*> v;//链表头节点指针类型的vector(返回值) queue<TreeNode*>q;//队列,用于存储每一层的值 q.push(tree);//初始化,将root放入队列 while(!q.empty()){//退出条件:队列为空 ListNode*head=new ListNode();//创建空的头节点 ListNode*k=head;//创建指针k指向头节点 int qsize=q.size();//获得当前队列元素个数 for(int i=0;i<qsize;i++){//遍历当前队列每一个元素 TreeNode*p=q.front();//用p存储队列的头一个节点 q.pop();//将头节点剔除 k->next=new ListNode(p->val);//给链表添加下一个节点并赋值 k=k->next;//k指针向后移 if(p->left) q.push(p->left);//若该TreeNode有左孩子,将左孩子加入队列 if(p->right) q.push(p->right);//同上 } v.push_back(head->next);//将该层的链表放入vector } return v;//遍历完所有层返回 } };
时间复杂度 O(n^2),空间复杂度O(n)
注意:
代码中的for循环:
复制代码
1
2
3int qsize=q.size();//获得当前队列元素个数 for(int i=0;i<qsize;i++){//遍历当前队列每一个元素
for循环的判断条件一定不能直接使用q.size()
因为你再执行一次循环中对这个队列进行了删除和插入操作,所以每一次循环后q.size()都有可能会改变,这就会影响到循环的判断条件!
如果不想定义qsize这个变量,也可以这么写:
复制代码
1
2for(int i=q.size();i>0;i--)
这时i就会是该层一开始时的队列大小,条件也不会改变,就不会出错了。
最后
以上就是飘逸小海豚最近收集整理的关于LeetCode面试题 04.03. 特定深度节点链表的全部内容,更多相关LeetCode面试题内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复