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完整代码如下:

  1. package main
  2. import (
  3. "container/list"
  4. "fmt"
  5. )
  6. type TreeNode struct {
  7. Val int
  8. Left *TreeNode
  9. Right *TreeNode
  10. }
  11. type Info struct {
  12. Node *TreeNode
  13. Index int
  14. }
  15. func widthOfBinaryTree(root *TreeNode) int {
  16. if root == nil {
  17. return 0
  18. }
  19. var ans, left, right int
  20. queue := list.New()
  21. queue.PushBack(&Info{Node: root, Index: 1})
  22. for queue.Len() > 0 {
  23. size := queue.Len()
  24. for i := 0; i < size; i++ {
  25. cur := queue.Front().Value.(*Info)
  26. queue.Remove(queue.Front())
  27. if i == 0 {
  28. left = cur.Index
  29. }
  30. if i == size-1 {
  31. right = cur.Index
  32. }
  33. if cur.Node.Left != nil {
  34. queue.PushBack(&Info{Node: cur.Node.Left, Index: cur.Index * 2})
  35. }
  36. if cur.Node.Right != nil {
  37. queue.PushBack(&Info{Node: cur.Node.Right, Index: cur.Index*2 + 1})
  38. }
  39. }
  40. ans = max(ans, right-left+1)
  41. }
  42. return ans
  43. }
  44. func max(a, b int) int {
  45. if a > b {
  46. return a
  47. }
  48. return b
  49. }
  50. func main() {
  51. root := &TreeNode{
  52. Val: 1,
  53. Left: &TreeNode{
  54. Val: 3,
  55. Left: &TreeNode{
  56. Val: 5,
  57. },
  58. },
  59. Right: &TreeNode{
  60. Val: 2,
  61. Right: &TreeNode{
  62. Val: 3,
  63. Right: &TreeNode{
  64. Val: 9,
  65. },
  66. },
  67. },
  68. }
  69. fmt.Println(widthOfBinaryTree(root))
  70. }

c++完整代码如下:

  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. struct TreeNode {
  5. int val;
  6. TreeNode* left;
  7. TreeNode* right;
  8. TreeNode() : val(0), left(nullptr), right(nullptr) {}
  9. TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  10. TreeNode(int x, TreeNode* left, TreeNode* right) : val(x), left(left), right(right) {}
  11. };
  12. struct Info {
  13. TreeNode* node;
  14. int index;
  15. Info(TreeNode* n, int i) : node(n), index(i) {};
  16. };
  17. int widthOfBinaryTree(TreeNode* root) {
  18. if (!root) {
  19. return 0;
  20. }
  21. int ans = 1;
  22. int leftmost_idx, rightmost_idx;
  23. queue<Info> q;
  24. q.push(Info(root, 1));
  25. while (!q.empty()) {
  26. int level_size = q.size();
  27. leftmost_idx = q.front().index, rightmost_idx = q.front().index;
  28. for (int i = 0; i < level_size; i++) {
  29. Info cur = q.front();
  30. q.pop();
  31. leftmost_idx = min(leftmost_idx, cur.index);
  32. rightmost_idx = max(rightmost_idx, cur.index);
  33. if (cur.node->left) {
  34. q.push(Info(cur.node->left, cur.index << 1));
  35. }
  36. if (cur.node->right) {
  37. q.push(Info(cur.node->right, (cur.index << 1) | 1));
  38. }
  39. }
  40. ans = max(ans, rightmost_idx - leftmost_idx + 1);
  41. }
  42. return ans;
  43. }
  44. int main() {
  45. TreeNode* root = new TreeNode(1);
  46. root->left = new TreeNode(3);
  47. root->right = new TreeNode(2);
  48. root->left->left = new TreeNode(5);
  49. root->left->right = nullptr;
  50. root->right->left = new TreeNode(3);
  51. root->right->right = new TreeNode(9);
  52. cout << widthOfBinaryTree(root) << endl;
  53. return 0;
  54. }

c语言完整代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4. struct TreeNode {
  5. int val;
  6. struct TreeNode* left;
  7. struct TreeNode* right;
  8. };
  9. struct TreeNode* newTreeNode() {
  10. struct TreeNode* ans = (struct TreeNode*)malloc(sizeof(struct TreeNode));
  11. ans->val = 0;
  12. ans->left = NULL;
  13. ans->right = NULL;
  14. return ans;
  15. };
  16. struct Info {
  17. struct TreeNode* node;
  18. int index;
  19. };
  20. int widthOfBinaryTree(struct TreeNode* root) {
  21. if (!root) {
  22. return 0;
  23. }
  24. int ans = 1;
  25. int leftmost_idx, rightmost_idx;
  26. struct Info init = { root, 1 };
  27. struct Info cur;
  28. struct TreeNode* node;
  29. struct Info* q = newTreeNode();
  30. int head = 0, tail = 0;
  31. q[head++] = init;
  32. while (head != tail) {
  33. int level_size = head - tail;
  34. leftmost_idx = q[tail].index, rightmost_idx = q[tail].index;
  35. for (int i = 0; i < level_size; i++) {
  36. cur = q[tail++];
  37. leftmost_idx = leftmost_idx < cur.index ? leftmost_idx : cur.index;
  38. rightmost_idx = rightmost_idx > cur.index ? rightmost_idx : cur.index;
  39. node = cur.node;
  40. if (node->left) {
  41. q = (struct Info*)realloc(q, sizeof(struct Info) * (head + 1));
  42. q[head++] = (struct Info){ node->left, cur.index << 1 };
  43. }
  44. if (node->right) {
  45. q = (struct Info*)realloc(q, sizeof(struct Info) * (head + 1));
  46. q[head++] = (struct Info){ node->right, (cur.index << 1) | 1 };
  47. }
  48. }
  49. ans = max(ans, rightmost_idx - leftmost_idx + 1);
  50. }
  51. free(q);
  52. return ans;
  53. }
  54. int main() {
  55. struct TreeNode* root = newTreeNode();
  56. root->val = 1;
  57. root->left = newTreeNode();
  58. root->left->val = 3;
  59. root->right = newTreeNode();
  60. root->right->val = 2;
  61. root->left->left = newTreeNode();
  62. root->left->left->val = 5;
  63. root->left->right = NULL;
  64. root->right->left = newTreeNode();
  65. root->right->left->val = 3;
  66. root->right->right = newTreeNode();
  67. root->right->right->val = 9;
  68. printf("%d\n", widthOfBinaryTree(root));
  69. free(root->left->left);
  70. free(root->left);
  71. free(root->right->left);
  72. free(root->right->right);
  73. free(root->right);
  74. free(root);
  75. return 0;
  76. }

2023-06-08:给你一棵二叉树的根节点 root ,返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度的更多相关文章

  1. 【转】mysql数据库中实现内连接、左连接、右连接

    [转]mysql数据库中实现内连接.左连接.右连接 内连接:把两个表中数据对应的数据查出来 外连接:以某个表为基础把对应数据查出来 首先创建数据库中的表,数据库代码如下: /* Navicat MyS ...

  2. 设计一个算法,求非空二叉树中指定的第k层(k&gt;1)的叶子节点的个数

    思想:採用基于层序遍历的方法. 用level扫描各层节点,若某一层的节点出队后.rear指向该层中最右节点.则将rear赋值给last(对于第一层.last=1).在出队时,若front=last,表 ...

  3. 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  4. 输入两棵二叉树A,B,判断B是不是A的子结构(c++实现)

    #include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...

  5. TensorFlow从入门到实战资料汇总 2017-02-02 06:08 | 数据派

    TensorFlow从入门到实战资料汇总 2017-02-02 06:08 | 数据派 来源:DataCastle数据城堡 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学 ...

  6. 笔试算法题(36):寻找一棵二叉树中最远节点的距离 & 根据二叉树的前序和后序遍历重建二叉树

    出题:求二叉树中距离最远的两个节点之间的距离,此处的距离定义为节点之间相隔的边数: 分析: 最远距离maxDis可能并不经过树的root节点,而树中的每一个节点都可能成为最远距离经过的子树的根节点:所 ...

  7. Invert a binary tree 翻转一棵二叉树

    Invert a binary tree 翻转一棵二叉树 假设有如下一棵二叉树: 4  / \   2    7  / \   / \ 1  3 6  9翻转后: 4     /    \    7 ...

  8. LeetCode:114_Flatten Binary Tree to Linked List | 将一棵二叉树变成链表的形式 | Medium

    要求:Given a binary tree, flatten it to a linked list in-place.将二叉树转化为平坦序列的树.比如: 结题思路: 该题有个提示,转化后的树的序列 ...

  9. caffe中使用python定义新的层

    转载链接:http://withwsf.github.io/2016/04/14/Caffe-with-Python-Layer/ Caffe通过Boost中的Boost.Python模块来支持使用P ...

  10. C++ 推断一棵二叉树是否对称

    一棵二叉树对称,就是说它假设以根为轴,翻转过去一样.例如以下图所看到的,以虚线为轴.把左边翻转到右边,各顶点及顶点中的值一一相应. watermark/2/text/aHR0cDovL2Jsb2cuY ...

随机推荐

  1. MySQL8.0 创建用户及授权 - 看这篇就足够了

    什么时候会用到 对接外系统时,需要给其余系统开放访问权限 本系统中,分权限管理数据,防止root权限删库跑路 mysql版本 MySql8.0+ 具体步骤 1.命令行进入MySql 使用 mysql ...

  2. import tensorflow出现ImportError: DLL load failed: 找不到指定的模块的问题(亲测可用)

    错误如下图所示: 在很长时间的查找后,网上的很多办法都不能很好的解决问题,但是基本上指向了一个问题--版本问题,所以接下来我安装了与python环境对应的tensorflow包. 首先用以下命令查找对 ...

  3. react中的虚拟DOM,jsx,diff算法。让代码更高效

    在react中当你的状态发生改变时,并不是所有组件的内容销毁再重建,能复用的就复用 react 组件其实 就是按照层级划分的 找到两棵任意的树之间最小的修改是一个复杂度为 O(n^3) 的问题. 你可 ...

  4. GKCTF X DASCTF应急挑战杯-Maple_root-Writeup

    GKCTF X DASCTF应急挑战杯-Maple_root-Writeup 参赛队员: b4tteRy, x0r, f1oat 最终成绩:2285 最终排名:27 总结 经过最近几次类线下的演练,感 ...

  5. 二进制安装Kubernetes(k8s) v1.24.2 IPv4/IPv6双栈

    二进制安装Kubernetes(k8s) v1.24.2 IPv4/IPv6双栈 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes二进制安装 强烈建议在Github ...

  6. Python常见面试题016. 请实现如下功能|谈谈你对闭包的理解

    016. 请实现如下功能|谈谈你对闭包的理解 摘自<流畅的python> 第七章 函数装饰器和闭包 实现一个函数(可以不是函数)avg,计算不断增加的系列值的平均值,效果如下 def av ...

  7. Mybatis 框架下 SQL 注入攻击的方式

    前言 SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少. 新手代码审计者往往对Java Web应用的多个框架组合而心生畏惧,不知如何下手 ...

  8. css中文字与图片对齐

    css中文字与图片对齐 第一种,使用vertical-align:middle .icon{ background-repeat:no-repeat; background-position:cent ...

  9. springboot-poi ---封装注解式导入导出

    此demo 是基于poi封装对象式注解导入导出,项目框架为springboot项目! 简单的说明一下此demo涉及到的知识点,希望能给初学者带来方便! poi-excel 基本操作(工具) 自定义注解 ...

  10. Django框架简单搭建增删改查页面 Django请求生命周期流程图

    目录 Django框架简单搭建增删改查页面 一.前期的配置文件以及连接MySQL的基本准备 二.在数据库中准备好数据 三.将MySQL的数据展示到页面(简单认识HTML模板语法 for循环) 在Dja ...