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就会是该层一开始时的队列大小,条件也不会改变,就不会出错了。