2023-06-08:给你一棵二叉树的根节点 root ,返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度
2023-06-08:给你一棵二叉树的根节点 root ,返回树的 最大宽度 。
树的 最大宽度 是所有层中最大的 宽度 。
每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。
将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,
这些 null 节点也计入长度。
题目数据保证答案将会在 32 位 带符号整数范围内。
输入:root = [1,3,2,5,3,null,9]。
输出:4。
答案2023-06-09:
大体步骤如下:
该算法使用一个容器来存储节点的信息,每个节点信息包含节点本身和其在满二叉树中的位置。
1.如果root为空,返回0,否则初始化一个变量ans来记录最大宽度。
2.使用一个队列queue来存储节点信息,将根节点的信息{root,1}加入队列。
3.循环处理队列,每次处理一层,对于每个节点:
a.pop出队列中的节点信息,将该节点作为当前节点cur。
b.如果当前节点是该层的第一个节点,则记录其Index为left。
c.如果当前节点是该层的最后一个节点,则记录其Index为right。
d.如果当前节点有左孩子,则将其左孩子信息{cur.Node.Left,cur.Index*2}加入队列。
e.如果当前节点有右孩子,则将其右孩子信息{cur.Node.Right,cur.Index*2+1}加入队列。
4.计算当前层的宽度,将其记录为max(right-left+1,ans)。
5.返回最大宽度ans。
时间复杂度:每个节点仅仅入队、出队各一次,因此时间复杂度为O(N),其中N为树中节点的数量。
空间复杂度:本算法使用了一个队列来存储节点信息,队列中的节点数量不会超过两层的节点数,因此空间复杂度为O(2^h),其中h为树的高度。如果是完全二叉树,h=logN,空间复杂度为O(N)。
golang完整代码如下:
package main
import (
"container/list"
"fmt"
)
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
type Info struct {
Node *TreeNode
Index int
}
func widthOfBinaryTree(root *TreeNode) int {
if root == nil {
return 0
}
var ans, left, right int
queue := list.New()
queue.PushBack(&Info{Node: root, Index: 1})
for queue.Len() > 0 {
size := queue.Len()
for i := 0; i < size; i++ {
cur := queue.Front().Value.(*Info)
queue.Remove(queue.Front())
if i == 0 {
left = cur.Index
}
if i == size-1 {
right = cur.Index
}
if cur.Node.Left != nil {
queue.PushBack(&Info{Node: cur.Node.Left, Index: cur.Index * 2})
}
if cur.Node.Right != nil {
queue.PushBack(&Info{Node: cur.Node.Right, Index: cur.Index*2 + 1})
}
}
ans = max(ans, right-left+1)
}
return ans
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
root := &TreeNode{
Val: 1,
Left: &TreeNode{
Val: 3,
Left: &TreeNode{
Val: 5,
},
},
Right: &TreeNode{
Val: 2,
Right: &TreeNode{
Val: 3,
Right: &TreeNode{
Val: 9,
},
},
},
}
fmt.Println(widthOfBinaryTree(root))
}

c++完整代码如下:
#include <iostream>
#include <queue>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode* left, TreeNode* right) : val(x), left(left), right(right) {}
};
struct Info {
TreeNode* node;
int index;
Info(TreeNode* n, int i) : node(n), index(i) {};
};
int widthOfBinaryTree(TreeNode* root) {
if (!root) {
return 0;
}
int ans = 1;
int leftmost_idx, rightmost_idx;
queue<Info> q;
q.push(Info(root, 1));
while (!q.empty()) {
int level_size = q.size();
leftmost_idx = q.front().index, rightmost_idx = q.front().index;
for (int i = 0; i < level_size; i++) {
Info cur = q.front();
q.pop();
leftmost_idx = min(leftmost_idx, cur.index);
rightmost_idx = max(rightmost_idx, cur.index);
if (cur.node->left) {
q.push(Info(cur.node->left, cur.index << 1));
}
if (cur.node->right) {
q.push(Info(cur.node->right, (cur.index << 1) | 1));
}
}
ans = max(ans, rightmost_idx - leftmost_idx + 1);
}
return ans;
}
int main() {
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(3);
root->right = new TreeNode(2);
root->left->left = new TreeNode(5);
root->left->right = nullptr;
root->right->left = new TreeNode(3);
root->right->right = new TreeNode(9);
cout << widthOfBinaryTree(root) << endl;
return 0;
}

c语言完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
struct TreeNode* newTreeNode() {
struct TreeNode* ans = (struct TreeNode*)malloc(sizeof(struct TreeNode));
ans->val = 0;
ans->left = NULL;
ans->right = NULL;
return ans;
};
struct Info {
struct TreeNode* node;
int index;
};
int widthOfBinaryTree(struct TreeNode* root) {
if (!root) {
return 0;
}
int ans = 1;
int leftmost_idx, rightmost_idx;
struct Info init = { root, 1 };
struct Info cur;
struct TreeNode* node;
struct Info* q = newTreeNode();
int head = 0, tail = 0;
q[head++] = init;
while (head != tail) {
int level_size = head - tail;
leftmost_idx = q[tail].index, rightmost_idx = q[tail].index;
for (int i = 0; i < level_size; i++) {
cur = q[tail++];
leftmost_idx = leftmost_idx < cur.index ? leftmost_idx : cur.index;
rightmost_idx = rightmost_idx > cur.index ? rightmost_idx : cur.index;
node = cur.node;
if (node->left) {
q = (struct Info*)realloc(q, sizeof(struct Info) * (head + 1));
q[head++] = (struct Info){ node->left, cur.index << 1 };
}
if (node->right) {
q = (struct Info*)realloc(q, sizeof(struct Info) * (head + 1));
q[head++] = (struct Info){ node->right, (cur.index << 1) | 1 };
}
}
ans = max(ans, rightmost_idx - leftmost_idx + 1);
}
free(q);
return ans;
}
int main() {
struct TreeNode* root = newTreeNode();
root->val = 1;
root->left = newTreeNode();
root->left->val = 3;
root->right = newTreeNode();
root->right->val = 2;
root->left->left = newTreeNode();
root->left->left->val = 5;
root->left->right = NULL;
root->right->left = newTreeNode();
root->right->left->val = 3;
root->right->right = newTreeNode();
root->right->right->val = 9;
printf("%d\n", widthOfBinaryTree(root));
free(root->left->left);
free(root->left);
free(root->right->left);
free(root->right->right);
free(root->right);
free(root);
return 0;
}

2023-06-08:给你一棵二叉树的根节点 root ,返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度的更多相关文章
- 【转】mysql数据库中实现内连接、左连接、右连接
[转]mysql数据库中实现内连接.左连接.右连接 内连接:把两个表中数据对应的数据查出来 外连接:以某个表为基础把对应数据查出来 首先创建数据库中的表,数据库代码如下: /* Navicat MyS ...
- 设计一个算法,求非空二叉树中指定的第k层(k>1)的叶子节点的个数
思想:採用基于层序遍历的方法. 用level扫描各层节点,若某一层的节点出队后.rear指向该层中最右节点.则将rear赋值给last(对于第一层.last=1).在出队时,若front=last,表 ...
- 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 输入两棵二叉树A,B,判断B是不是A的子结构(c++实现)
#include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...
- TensorFlow从入门到实战资料汇总 2017-02-02 06:08 | 数据派
TensorFlow从入门到实战资料汇总 2017-02-02 06:08 | 数据派 来源:DataCastle数据城堡 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学 ...
- 笔试算法题(36):寻找一棵二叉树中最远节点的距离 & 根据二叉树的前序和后序遍历重建二叉树
出题:求二叉树中距离最远的两个节点之间的距离,此处的距离定义为节点之间相隔的边数: 分析: 最远距离maxDis可能并不经过树的root节点,而树中的每一个节点都可能成为最远距离经过的子树的根节点:所 ...
- Invert a binary tree 翻转一棵二叉树
Invert a binary tree 翻转一棵二叉树 假设有如下一棵二叉树: 4 / \ 2 7 / \ / \ 1 3 6 9翻转后: 4 / \ 7 ...
- LeetCode:114_Flatten Binary Tree to Linked List | 将一棵二叉树变成链表的形式 | Medium
要求:Given a binary tree, flatten it to a linked list in-place.将二叉树转化为平坦序列的树.比如: 结题思路: 该题有个提示,转化后的树的序列 ...
- caffe中使用python定义新的层
转载链接:http://withwsf.github.io/2016/04/14/Caffe-with-Python-Layer/ Caffe通过Boost中的Boost.Python模块来支持使用P ...
- C++ 推断一棵二叉树是否对称
一棵二叉树对称,就是说它假设以根为轴,翻转过去一样.例如以下图所看到的,以虚线为轴.把左边翻转到右边,各顶点及顶点中的值一一相应. watermark/2/text/aHR0cDovL2Jsb2cuY ...
随机推荐
- odoo 开发入门教程系列-安全-简介
安全-简介 前一章中我们已经创建了第一个打算用于存储业务数据的表.在odoo这样的一个商业应用中,第一个考虑的问题就是谁(Odoo 用户(或者组用户))可以访问数据.odoo为指定用户组用户提供了一个 ...
- 剑指 offer 第 24 天
第 24 天 数学(中等) 剑指 Offer 14- I. 剪绳子 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[ ...
- ACM-DP-数塔问题
Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告 ...
- Unity3D中的Attribute详解(五)
今天主要来讲一下Unity中带Menu的Attribute. 首先是AddComponentMenu.这是UnityEngine命名空间下的一个Attribute. 按照官方文档的说法,会在Compo ...
- ICMP隐蔽隧道攻击分析与检测(四)
• ICMP隧道攻击通讯特征和特征提取 一.ICMP Ping正常通讯特征总结 一个正常的 ping 每秒最多只会发送两个数据包,而使用 ICMP隧道的服务器在同一时间会产生大量 ICMP 数据包 正 ...
- opengl helloworld vscode 通过glfw 绘制三角形
opengl helloworld vscode 调用glfw 绘制三角形 目录 opengl helloworld vscode 调用glfw 绘制三角形 打开 glfw.org, 我下的64 目录 ...
- 利用 kubeadm 创建 kubernetes (k8s) 的高可用集群
引言: kubeadm提供了两种不同的高可用方案. 堆叠方案:etcd服务和控制平面被部署在同样的节点中,对基础设施的要求较低,对故障的应对能力也较低 堆叠方案 最小三个Master(也称工作平面), ...
- [软件工程/数据工程] 软件工程&数据工程知识体系
1 概述 本篇是为了重新总结.重新编写5年前(2018-12-31 00:06),临近毕业时的一篇文章软件工程专业知识体系[求职/就业]而作,至此篇文章发布时,原文文章应已被删除.但第1章节中仍会存在 ...
- python去掉重复值的方法--四种
my_list = [1,1,1,1,2,3,3,3,4,5,5,56,6,7,77,7,5,5,3]# 集合法:缺点是结果会打乱原始数据的顺序print(set(my_list)) # 列表法:缺点 ...
- C# System.ObjectDisposedException: Cannot access a disposed object, A common cause of thiserror is disposing a context that was resolved from dependency injection and then later trying touse...
项目中使用了依赖注入,这个错误在我项目中的原因:在async修饰的异步方法中,调用执行数据库操作的方法时,没有使用await关键字调用,因为没有等待该调用,所以在调用完成之前将继续执行该方法.因此,已 ...