LeetCode面试题 04.03. 特定深度节点链表

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

猜你喜欢

转载自blog.csdn.net/qq_45035709/article/details/108806956