算法题 二叉树的完全性检验

二叉树的完全性检验

问题描述

给定一个二叉树的根节点root,判断该二叉树是否为完全二叉树

完全二叉树定义
在完全二叉树中,除了最底层外,其他层都被完全填满,并且所有结点都尽可能地向左集中。最底层的结点可以不满,但必须从左到右连续排列,不能有“空洞”。

示例

输入: [1,2,3,4,5,6] 输出: true 解释: 所有层都被完全填满,是完全二叉树。 输入: [1,2,3,4,5,null,7] 输出: false 解释: 最底层右边有空洞(6的位置为空,但7存在),不是完全二叉树。

算法思路

层序遍历(BFS)

  1. 使用队列进行层序遍历
  2. 遇到第一个null节点后,后续所有节点都必须是null
  3. 如果在遇到null后又遇到非null节点,说明存在空洞,不是完全二叉树

代码实现

方法一:层序遍历

importjava.util.*;/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */classSolution{/** * 判断二叉树是否为完全二叉树 * * @param root 二叉树根节点 * @return 如果是完全二叉树返回true,否则返回false */publicbooleanisCompleteTree(TreeNoderoot){if(root==null){returntrue;}Queue<TreeNode>queue=newLinkedList<>();queue.offer(root);booleanfoundNull=false;// 标记是否遇到了第一个null节点while(!queue.isEmpty()){TreeNodenode=queue.poll();if(node==null){// 遇到null节点,标记为已发现nullfoundNull=true;}else{// 如果之前已经遇到过null,现在又遇到非null节点// 说明存在空洞,不是完全二叉树if(foundNull){returnfalse;}// 将左右子节点加入队列(包括null节点)queue.offer(node.left);queue.offer(node.right);}}returntrue;}}

方法二:节点编号

importjava.util.*;classSolution{/** * 基于节点编号验证完全二叉树 * 完全二叉树按层序遍历编号时,节点编号应该是连续的1,2,3,...,n * * @param root 二叉树根节点 * @return 如果是完全二叉树返回true,否则返回false */publicbooleanisCompleteTree(TreeNoderoot){if(root==null){returntrue;}Queue<TreeNode>queue=newLinkedList<>();Queue<Integer>indices=newLinkedList<>();// 存储对应节点的编号queue.offer(root);indices.offer(1);// 根节点编号为1intcount=0;// 实际节点数量intlastIdx=0;// 最后一个节点的编号while(!queue.isEmpty()){TreeNodenode=queue.poll();intidx=indices.poll();count++;lastIdx=idx;if(node.left!=null){queue.offer(node.left);indices.offer(idx*2);// 左子节点编号为父节点编号*2}if(node.right!=null){queue.offer(node.right);indices.offer(idx*2+1);// 右子节点编号为父节点编号*2+1}}// 如果是完全二叉树,最后一个节点的编号应该等于总节点数returnlastIdx==count;}}

算法分析

  • 时间复杂度:O(n)
    • 两种方法都需要遍历所有节点一次
  • 空间复杂度:O(w)
    • w 为二叉树的最大宽度,最坏情况下为 O(n)(完全二叉树最后一层)

算法过程

输入[1,2,3,4,5,null,7]

方法一:

  1. 队列初始:[1]foundNull = false
  2. 处理节点1:加入子节点[2,3]foundNull = false
  3. 处理节点2:加入子节点[4,5],队列变为[3,4,5]
  4. 处理节点3:加入子节点[null,7],队列变为[4,5,null,7]
  5. 处理节点4:加入子节点[null,null],队列变为[5,null,7,null,null]
  6. 处理节点5:加入子节点[null,null],队列变为[null,7,null,null,null,null]
  7. 处理nullfoundNull = true
  8. 处理节点7:此时foundNull = true且遇到非null节点,返回false

方法二:

  1. 节点1:编号1,count=1,lastIdx=1
  2. 节点2:编号2,count=2,lastIdx=2
  3. 节点3:编号3,count=3,lastIdx=3
  4. 节点4:编号4,count=4,lastIdx=4
  5. 节点5:编号5,count=5,lastIdx=5
  6. 节点7:编号7,count=6,lastIdx=7
  7. 验证:lastIdx(7) != count(6),返回false

测试用例

publicclassTestCompleteBinaryTree{// 构建测试用的二叉树工具方法privatestaticTreeNodebuildTree(Integer[]arr){if(arr==null||arr.length==0||arr[0]==null){returnnull;}TreeNoderoot=newTreeNode(arr[0]);Queue<TreeNode>queue=newLinkedList<>();queue.offer(root);inti=1;while(!queue.isEmpty()&&i<arr.length){TreeNodenode=queue.poll();if(i<arr.length&&arr[i]!=null){node.left=newTreeNode(arr[i]);queue.offer(node.left);}i++;if(i<arr.length&&arr[i]!=null){node.right=newTreeNode(arr[i]);queue.offer(node.right);}i++;}returnroot;}publicstaticvoidmain(String[]args){Solutionsolution=newSolution();// 测试用例1:完全二叉树Integer[]tree1={1,2,3,4,5,6};System.out.println("Test 1: "+solution.isCompleteTree(buildTree(tree1)));// true// 测试用例2:非完全二叉树(有空洞)Integer[]tree2={1,2,3,4,5,null,7};System.out.println("Test 2: "+solution.isCompleteTree(buildTree(tree2)));// false// 测试用例3:单节点Integer[]tree3={1};System.out.println("Test 3: "+solution.isCompleteTree(buildTree(tree3)));// true// 测试用例4:只有左子树Integer[]tree4={1,2,null,4,5};System.out.println("Test 4: "+solution.isCompleteTree(buildTree(tree4)));// false// 测试用例5:满二叉树Integer[]tree5={1,2,3,4,5,6,7};System.out.println("Test 5: "+solution.isCompleteTree(buildTree(tree5)));// true// 测试用例6:空树Integer[]tree6={};System.out.println("Test 6: "+solution.isCompleteTree(buildTree(tree6)));// true// 测试用例7:只有右子树Integer[]tree7={1,null,3,null,7};System.out.println("Test 7: "+solution.isCompleteTree(buildTree(tree7)));// false}}

关键点

  1. 完全二叉树

    • 层序遍历中不能有"空洞"
    • 一旦出现null,后续必须全部为null
  2. 层序遍历

    • 必须按层从左到右遍历
    • 需要将null节点也加入队列进行处理
  3. 边界情况处理

    • 空树被认为是完全二叉树
    • 单节点树是完全二叉树
    • 只有左子树的树可能是完全二叉树,只有右子树的一定不是

常见问题

  1. 为什么需要将 null 节点加入队列?

    • 为了检测空洞,必须知道在什么位置出现了 null,以及 null 之后是否还有非 null 节点。
  2. 完全二叉树和满二叉树的区别?

    • 满二叉树:所有层都完全填满
    • 完全二叉树:除最后一层外都填满,最后一层从左到右连续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1191763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

192S04M0131A分布式控制系统

192S04M0131A 分布式控制系统&#xff08;DCS&#xff09;特点概览&#xff1a;模块化架构&#xff1a;核心处理单元、I/O模块和通信模块可灵活组合&#xff0c;便于扩展和升级。高性能处理能力&#xff1a;实时处理大量控制指令&#xff0c;保证复杂工业流程稳定运行。多通道控…

2026年第一季度工业烘干机生产厂家综合评估报告

文章摘要 在“双碳”目标与产业升级的双重驱动下,2026年第一季度工业烘干机市场呈现出对高效节能与智能化解决方案的迫切需求。本报告基于资本资源、技术产品、服务交付、数据生态、安全合规及市场品牌六大核心维度,…

用Qwen-Image打造海报设计工具,中文排版一步到位

用Qwen-Image打造海报设计工具&#xff0c;中文排版一步到位 你有没有遇到过这样的情况&#xff1a;想做个带中文文案的海报&#xff0c;结果AI生成的文字要么乱码、要么字体丑得没法用&#xff1f;设计师手动排版又费时费力。现在&#xff0c;这个问题终于有了解决方案——阿…

如何将照片从 Pixel 传输到计算机 [实用指南]

谷歌Pixel手机的出色摄像头让您能够拍摄高质量照片&#xff0c;记录生活中的精彩瞬间。然而&#xff0c;更高质量的照片也占用更多存储空间。好消息是&#xff0c;您无需删除谷歌Pixel手机上的这些珍贵照片&#xff1b;您可以学习如何使用以下5种方法将照片从Pixel手机传输到电…

学生党如何跑动GPEN?低配GPU显存优化实战技巧

学生党如何跑动GPEN&#xff1f;低配GPU显存优化实战技巧 你是不是也遇到过这种情况&#xff1a;看到一个超厉害的人像修复AI模型&#xff0c;兴冲冲下载下来&#xff0c;结果一运行就爆显存&#xff0c;GPU直接卡死&#xff1f;别急&#xff0c;这不怪你电脑不行&#xff0c;…

R6581T高级数字多媒体

R6581T 高级数字多媒体设备特点概览&#xff1a;高性能处理器&#xff1a;内置高速数字信号处理器&#xff0c;支持复杂音视频计算。多媒体兼容性&#xff1a;支持多种音视频格式解码和编码&#xff0c;兼容主流媒体标准。高清输出&#xff1a;提供1080p甚至4K分辨率的视频输出…

算法题 在长度 2N 的数组中找出重复 N 次的元素

在长度 2N 的数组中找出重复 N 次的元素 问题描述 给定一个整数数组 nums&#xff0c;其长度为 2N。数组中恰好有一个元素重复了 N 次&#xff0c;其余 N 个元素都是唯一的。请返回重复了 N 次的元素。 约束条件&#xff1a; 2 < nums.length < 10000nums.length 是偶数0…

为什么Qwen3-1.7B调用失败?LangChain接入避坑指南

为什么Qwen3-1.7B调用失败&#xff1f;LangChain接入避坑指南 你是不是也遇到了这样的问题&#xff1a;明明按照文档配置好了环境&#xff0c;代码看着也没错&#xff0c;可一运行 chat_model.invoke("你是谁&#xff1f;") 就报错&#xff0c;Qwen3-1.7B就是调不通…

有全局感受野的傅里叶卷积块用于MRI重建/文献速递-基于人工智能的医学影像技术

2026.1.20本文提出一种用于MRI重建的傅里叶卷积块&#xff08;FCB&#xff09;&#xff0c;通过将空间域卷积转换为频域操作&#xff0c;实现了全局感受野和低计算复杂度&#xff0c;并在多种CNN架构上展现出优于现有SOTA方法和Vision Transformer的重建性能&#xff0c;有效抑…

Qwen3Guard-Gen-WEB数据隔离:私有化部署实战

Qwen3Guard-Gen-WEB数据隔离&#xff1a;私有化部署实战 在AI应用快速落地的今天&#xff0c;内容安全审核已成为不可忽视的关键环节。尤其在企业级场景中&#xff0c;如何确保用户输入和模型响应不触碰合规红线&#xff0c;同时保障数据不出内网、实现彻底的数据隔离&#xf…

算法题 最大宽度坡

最大宽度坡 问题描述 给定一个整数数组 nums&#xff0c;定义一个坡为元组 (i, j)&#xff0c;其中 i < j 且 nums[i] < nums[j]。坡的宽度为 j - i。 请返回数组中最大宽度坡的宽度。如果没有坡&#xff0c;返回 0。 示例&#xff1a; 输入: [6,0,8,2,1,5] 输出: 4 解释…

unet image Face Fusion跨域问题解决?CORS配置正确姿势

unet image Face Fusion跨域问题解决&#xff1f;CORS配置正确姿势 1. 背景与问题引入 在部署基于 unet image Face Fusion 的人脸融合 WebUI 应用时&#xff0c;很多开发者会遇到一个看似简单却极具迷惑性的问题&#xff1a;前端页面能正常加载&#xff0c;但图片上传或融合…

江苏硕晟LIMS pro3.0:引领实验室信息管理新高度

公司介绍&#xff1a;专业铸就行业标杆江苏硕晟科学器材有限公司成立于2018年&#xff0c;是一家专注于实验室数字化转型的科技型中小企业。公司以"软件 硬件 服务 咨询"为核心业务模式&#xff0c;为各行业实验室提供一站式信息化解决方案。凭借在实验室信息管理…

Java Web mvc高校办公室行政事务管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

&#x1f4a1;实话实说&#xff1a;有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。摘要 随着高校规模的不断扩大和行政事务的日益复杂&#xff0c;传统的人工管理模式已难以满足高效、精准的管理需求。高校办公室行政事务管理系统旨在通…

Qwen3-Embedding-0.6B与text-embedding-ada-002对比评测

Qwen3-Embedding-0.6B与text-embedding-ada-002对比评测 1. Qwen3-Embedding-0.6B 模型解析 1.1 核心能力与技术背景 Qwen3 Embedding 模型系列是 Qwen 家族中专为文本嵌入和排序任务打造的最新成员&#xff0c;基于强大的 Qwen3 系列密集基础模型构建。该系列覆盖了从轻量级…

用Qwen3-0.6B做的第一个AI项目——新闻分类器上线

用Qwen3-0.6B做的第一个AI项目——新闻分类器上线 1. 项目背景与目标 最近在尝试把大模型真正用起来&#xff0c;而不是停留在“调API、跑demo”的阶段。于是决定动手做一个完整的AI小项目&#xff1a;基于Qwen3-0.6B搭建一个新闻自动分类系统&#xff0c;并把它部署上线&…

Z-Image-Turbo支持哪些格式?PNG转换技巧分享

Z-Image-Turbo支持哪些格式&#xff1f;PNG转换技巧分享 1. Z-Image-Turbo图像生成与输出格式详解 阿里通义Z-Image-Turbo WebUI图像快速生成模型&#xff0c;由社区开发者“科哥”基于DiffSynth Studio框架进行二次开发构建&#xff0c;是一款专注于高效、高质量AI图像生成的…

SpringBoot+Vue 在线问卷调查系统管理平台源码【适合毕设/课设/学习】Java+MySQL

&#x1f4a1;实话实说&#xff1a;有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。摘要 随着信息化时代的快速发展&#xff0c;问卷调查作为一种高效的数据收集方式&#xff0c;在学术研究、市场调研和社会分析等领域发挥着重要作用。传…

fft npainting lama日志轮转配置:避免磁盘空间耗尽最佳实践

fft npainting lama日志轮转配置&#xff1a;避免磁盘空间耗尽最佳实践 1. 引言&#xff1a;为什么日志管理至关重要 你有没有遇到过这样的情况&#xff1a;系统运行得好好的&#xff0c;突然某天发现WebUI打不开了&#xff0c;SSH连不上&#xff0c;或者提示“磁盘已满”&am…

Qwen3-1.7B vs Phi-3-mini:端侧部署可行性对比评测

Qwen3-1.7B vs Phi-3-mini&#xff1a;端侧部署可行性对比评测 1. 模型背景与核心定位 1.1 Qwen3-1.7B&#xff1a;轻量级通义千问的端侧潜力 Qwen3&#xff08;千问3&#xff09;是阿里巴巴集团于2025年4月29日开源的新一代通义千问大语言模型系列&#xff0c;涵盖6款密集模…