我是靠谱客的博主 飘逸小海豚,最近开发中收集的这篇文章主要介绍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就会是该层一开始时的队列大小,条件也不会改变,就不会出错了。

最后

以上就是飘逸小海豚为你收集整理的LeetCode面试题 04.03. 特定深度节点链表的全部内容,希望文章能够帮你解决LeetCode面试题 04.03. 特定深度节点链表所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部