为了保证制作简历的安全性和流畅性,建议您使用Chrome浏览器进行访问
Smell Billy 2021届
APP 内打开
1
7

新鲜面试题-特定深度节点链表

题目介绍:给定一个二叉树,设计一个算法,创建含有某一深度上所有节点的链表。(比如若一棵树深度为D,则会输出D个链表,第i个链表表示深度为i的一层节点的值构成的线性表)


思路1:深搜

在递归搜索时,传入当前点的层数,并按层加入到数组中。注意题目还要求每层节点的顺序是正确的,所以头插法更适合建立链表,后序遍历图即可完成。


代码实现:(见图更清楚哦)

```java

class Solution {

ArrayList arr;

public void dfs(TreeNode now, int lv){

if(lv==arr.size()) arr.add(new ListNode(now.val));

else{

ListNode ln = new ListNode(now.val);

ln.next = arr.get(lv);

arr.set(lv,ln);

}

if(now.right!=null) dfs(now.right,lv+1);

if(now.left!=null) dfs(now.left,lv+1);

}


public ListNode[] listOfDepth(TreeNode tree) {

arr = new ArrayList();

if(tree != null) dfs(tree,0);

return arr.toArray(new ListNode[] {});

}

}

```


复杂度分析:时间复杂度O(n),空间复杂度O(n)


思路2:广搜

每次搜完一层后,下一次开始搜索时,将搜索次数(也就是队列大小)设置为下一层的节点数量。


代码:

```java


class Solution {

public ListNode[] listOfDepth(TreeNode tree) {

ArrayList ans = new ArrayList();

Queue q = new LinkedList();

if(tree!=null) q.offer(tree);

while(!q.isEmpty()){

int num = q.size();

for(int i=0; i

TreeNode now = q.poll();

if(i==0) ans.add(new ListNode(now.val));

else{

ListNode ln = new ListNode(now.val);

ln.next = ans.get(ans.size()-1);

ans.set(ans.size()-1,ln);

}

if(now.right!=null) q.offer(now.right);

if(now.left!=null) q.offer(now.left);

}

}

return ans.toArray(new ListNode[]{});

}

}

```

复杂度分析:时间复杂度O(n),空间复杂度O(n)


欢迎扫描图中二维码关注我们的公众号,专注分享原味笔面试算法题解~~~


发布时间:2020年12月16日
用户头像
我来说两句…
共 7 条评论
非流 北京科技大学·2022届
好像我大三时候学过欸~
2020年12月16日 回复
Smell Billy 非流: 那说明老铁你也是算法爱好者嘿嘿
2020年12月17日 回复
非流 Smell Billy: 还行,我也就每天研究算法到这个点儿😏
2020年12月20日 回复
扯着俩个蛋四处跑骚≠ vivo·研发
感觉经常看到你呀
2020年12月17日 回复
Smell Billy 扯着俩个蛋四处跑骚≠: 哈哈哈哈哈哈我基本每天都发
2020年12月17日 回复
Sophia 山东理工大学·2022届
牛。。
2020年12月16日 回复
Smell Billy Sophia: 没有没有,互相学习
2020年12月17日 回复