当前位置:网站首页>【算法leetcode】面试题 04.03. 特定深度节点链表(多语言实现)
【算法leetcode】面试题 04.03. 特定深度节点链表(多语言实现)
2022-07-04 12:52:00 【二当家的白帽子】
文章目录
面试题 04.03. 特定深度节点链表:
给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D
,则会创建出 D
个链表)。返回一个包含所有深度的链表的数组。
样例 1:
输入:
[1,2,3,4,5,null,7,8]
1
/ \
2 3
/ \ \
4 5 7
/
8
输出:
[[1],[2,3],[4,5,7],[8]]
分析
- 面对这道算法题目,二当家的陷入了沉思。
- 如果对二叉树和链表比较熟悉,就会明白其实就是二叉树的层序遍历,每一层组合成一条链表。
题解
rust
// Definition for a binary tree node.
// #[derive(Debug, PartialEq, Eq)]
// pub struct TreeNode {
// pub val: i32,
// pub left: Option<Rc<RefCell<TreeNode>>>,
// pub right: Option<Rc<RefCell<TreeNode>>>,
// }
//
// impl TreeNode {
// #[inline]
// pub fn new(val: i32) -> Self {
// TreeNode {
// val,
// left: None,
// right: None
// }
// }
// }
// Definition for singly-linked list.
// #[derive(PartialEq, Eq, Clone, Debug)]
// pub struct ListNode {
// pub val: i32,
// pub next: Option<Box<ListNode>>
// }
//
// impl ListNode {
// #[inline]
// fn new(val: i32) -> Self {
// ListNode {
// next: None,
// val
// }
// }
// }
use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
pub fn list_of_depth(tree: Option<Rc<RefCell<TreeNode>>>) -> Vec<Option<Box<ListNode>>> {
let mut ans: Vec<Option<Box<ListNode>>> = Vec::new();
let mut queue = std::collections::VecDeque::new();
queue.push_back(tree);
while !queue.is_empty() {
let mut head = Some(Box::new(ListNode::new(0)));
let mut tail = head.as_mut();
let size = queue.len();
for _ in 0..size {
let node = queue.pop_front().unwrap().unwrap();
let mut node = node.borrow_mut();
if node.left.is_some() {
queue.push_back(node.left.take());
}
if node.right.is_some() {
queue.push_back(node.right.take());
}
tail.as_mut().unwrap().next = Some(Box::new(ListNode::new(node.val)));
tail = tail.unwrap().next.as_mut();
}
ans.push(head.as_mut().unwrap().next.take());
}
ans
}
}
go
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */
func listOfDepth(tree *TreeNode) []*ListNode {
var ans []*ListNode
queue := []*TreeNode{
tree}
for len(queue) > 0 {
head := &ListNode{
}
tail := head
size := len(queue)
for i := 0; i < size; i++ {
node := queue[i]
if node.Left != nil {
queue = append(queue, node.Left)
}
if node.Right != nil {
queue = append(queue, node.Right)
}
tail.Next = &ListNode{
Val: node.Val}
tail = tail.Next
}
ans = append(ans, head.Next)
queue = queue[size:]
}
return ans
}
typescript
/** * Definition for a binary tree node. * class TreeNode { * val: number * left: TreeNode | null * right: TreeNode | null * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } * } */
/** * Definition for singly-linked list. * class ListNode { * val: number * next: ListNode | null * constructor(val?: number, next?: ListNode | null) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } * } */
function listOfDepth(tree: TreeNode | null): Array<ListNode | null> {
const ans = [];
const queue = [tree];
while (queue.length > 0) {
const head = new ListNode();
let tail = head;
const size = queue.length;
for (let i = 0; i < size; ++i) {
const {
val, left, right } = queue.shift();
left && queue.push(left);
right && queue.push(right);
tail.next = new ListNode(val);
tail = tail.next;
}
ans.push(head.next);
}
return ans;
};
python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def listOfDepth(self, tree: TreeNode) -> List[ListNode]:
ans = []
q = collections.deque()
q.append(tree)
while len(q) > 0:
head = ListNode()
tail = head
size = len(q)
for _ in range(size):
node = q.popleft()
node.left and q.append(node.left)
node.right and q.append(node.right)
tail.next = ListNode(node.val)
tail = tail.next
ans.append(head.next)
return ans
c
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */
int getDepth(struct TreeNode* tree) {
if (!tree) {
return 0;
}
int leftDepth = getDepth(tree->left);
int rightDepth = getDepth(tree->right);
return fmax(leftDepth, rightDepth) + 1;
}
/** * Note: The returned array must be malloced, assume caller calls free(). */
struct ListNode** listOfDepth(struct TreeNode* tree, int* returnSize){
int depth = getDepth(tree);
struct ListNode **ans = malloc(depth * sizeof(struct ListNode *));
*returnSize = 0;
struct TreeNode *queue[(int) pow(2, depth) - 1];
queue[0] = tree;
int start = 0;
int end = 1;
while (start < end) {
struct ListNode head = {
};
struct ListNode *tail = &head;
int curEnd = end;
while (start < curEnd) {
struct TreeNode *node = queue[start++];
if (node->left) {
queue[end++] = node->left;
}
if (node->right) {
queue[end++] = node->right;
}
tail->next = malloc(sizeof(struct ListNode));
tail->next->val = node->val;
tail->next->next = NULL;
tail = tail->next;
}
ans[(*returnSize)++] = head.next;
}
return ans;
}
c++
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */
class Solution {
public:
vector<ListNode*> listOfDepth(TreeNode* tree) {
vector<ListNode *> ans;
queue<TreeNode *> q;
q.push(tree);
while (q.size() > 0) {
ListNode head = ListNode(0);
ListNode *tail = &head;
int size = q.size();
for (int i = 0; i < size; ++i) {
TreeNode *node = q.front();
q.pop();
if (node->left != NULL) {
q.push(node->left);
}
if (node->right != NULL) {
q.push(node->right);
}
tail->next = new ListNode(node->val);
tail = tail->next;
}
ans.emplace_back(head.next);
}
return ans;
}
};
java
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */
class Solution {
public ListNode[] listOfDepth(TreeNode tree) {
List<ListNode> list = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(tree);
while (!queue.isEmpty()) {
ListNode head = new ListNode();
ListNode tail = head;
int size = queue.size();
for (int i = 0; i < size; ++i) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
tail.next = new ListNode(node.val);
tail = tail.next;
}
list.add(head.next);
}
ListNode[] ans = new ListNode[list.size()];
list.toArray(ans);
return ans;
}
}
原题传送门:https://leetcode.cn/problems/list-of-depth-lcci/submissions/
非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~
边栏推荐
- MySQL之详解索引
- 去除重複字母[貪心+單調棧(用數組+len來維持單調序列)]
- 迅为IMX6Q开发板QT系统移植tinyplay
- Code hoof collection of wonderful secret place
- R language uses the DOTPLOT function of epidisplay package to visualize the frequency of data points in different intervals in the form of point graph, and uses the by parameter to specify the groupin
- Test process arrangement (3)
- 游戏出海,全球化运营
- ML之shap:基于boston波士顿房价回归预测数据集利用shap值对XGBoost模型实现可解释性案例
- R语言使用dplyr包的group_by函数和summarise函数基于分组变量计算目标变量的均值、标准差
- Matters needing attention in overseas game Investment Agency
猜你喜欢
docker-compose公网部署redis哨兵模式
【信息检索】链接分析
JVM memory layout detailed, illustrated, well written!
92.(cesium篇)cesium楼栋分层
Rich text editing: wangeditor tutorial
sql优化之查询优化器
TestSuite and testrunner in unittest
按照功能对Boost库进行分类
Huahao Zhongtian rushes to the scientific and Technological Innovation Board: the annual loss is 280million, and it is proposed to raise 1.5 billion. Beida pharmaceutical is a shareholder
迅为IMX6Q开发板QT系统移植tinyplay
随机推荐
Install and use MAC redis, connect to remote server redis
ML之shap:基于boston波士顿房价回归预测数据集利用shap值对XGBoost模型实现可解释性案例
学内核之三:使用GDB跟踪内核调用链
【MySQL从入门到精通】【高级篇】(五)MySQL的SQL语句执行流程
为什么图片传输要使用base64编码
Understand chisel language thoroughly 08. Chisel Foundation (V) -- wire, REG and IO, and how to understand chisel generation hardware
Understand chisel language thoroughly 12. Chisel project construction, operation and testing (IV) -- chisel test of chisel test
Leetcode T49: 字母异位词分组
卷积神经网络经典论文集合(深度学习分类篇)
GCC【6】- 编译的4个阶段
R language ggplot2 visualization: gganimate package creates dynamic line graph animation (GIF) and uses transition_ The reveal function displays data step by step along a given dimension in the animat
Innovation and development of independent industrial software
C# wpf 实现截屏框实时截屏功能
R语言使用dplyr包的mutate函数对指定数据列进行标准化处理(使用mean函数和sd函数)并基于分组变量计算标准化后的目标变量的分组均值
基于PaddleX的智能零售柜商品识别
数据中台概念
The game goes to sea and operates globally
nowcoder重排链表
[FAQ] Huawei Account Service Error Report 907135701 Common reasons Summary and Solutions
Code hoof collection of wonderful secret place