概述
LeetCode面试题 04.03. 特定深度节点链表
题目:
给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。
示例:
输入:[1,2,3,4,5,null,7,8]
1
/
2 3
/
4 5 7
/
8
输出:[[1],[2,3],[4,5,7],[8]]
题解:
经典的BFS题,将每一次层序遍历的结果存入一个链表然后存入链表型的vector里,最后返回该vector。
class 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循环:
int qsize=q.size();//获得当前队列元素个数
for(int i=0;i<qsize;i++){//遍历当前队列每一个元素
for循环的判断条件一定不能直接使用q.size()
因为你再执行一次循环中对这个队列进行了删除和插入操作,所以每一次循环后q.size()都有可能会改变,这就会影响到循环的判断条件!
如果不想定义qsize这个变量,也可以这么写:
for(int i=q.size();i>0;i--)
这时i就会是该层一开始时的队列大小,条件也不会改变,就不会出错了。
最后
以上就是飘逸小海豚为你收集整理的LeetCode面试题 04.03. 特定深度节点链表的全部内容,希望文章能够帮你解决LeetCode面试题 04.03. 特定深度节点链表所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复