发布时间:2026/8/23 8:47:38
数据结构:二叉树OJ题攻破 前言二叉树是数据结构与算法面试和笔试中的高频考点也是许多复杂算法如二叉搜索树、堆、AVL树等的基础。掌握二叉树的常见OJOnline Judge题目对于提升编程能力和算法思维至关重要。本文将系统梳理二叉树的核心OJ题型并提供清晰的解题思路和代码示例以C为主帮助你从原理到实战彻底攻破二叉树难题。一、高频OJ题型分类与攻破1.单值二叉树解题思路单值二叉树的判断核心是递归遍历。从根节点开始检查当前节点的值是否与左右子节点相同如果子节点存在。递归检查左右子树是否也都是单值二叉树。时间复杂度 O(n)空间复杂度 O(h)其中 h 为树高。关键知识点递归终止条件空树视为单值二叉树返回 true递归逻辑先检查当前节点与子节点的值是否一致再递归检查左右子树边界处理注意子节点可能为 NULL 的情况避免空指针访问递归返回值使用逻辑与连接左右子树的检查结果/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ bool isUnivalTree(struct TreeNode* root) { if(root NULL) return true; if(root-left root-left-val ! root-val) return false; if(root-right root-right-val ! root-val) return false; return isUnivalTree(root-left) isUnivalTree(root-right); }2. 对称二叉树解题思路对称二叉树的判断需要比较左右子树是否镜像对称。通过递归比较左子树的左节点与右子树的右节点以及左子树的右节点与右子树的左节点。时间复杂度 O(n)空间复杂度 O(h)其中 h 为树高。关键知识点递归逻辑比较当前节点的值然后递归比较左子树的左节点与右子树的右节点以及左子树的右节点与右子树的左节点镜像对称对称二叉树要求左右子树镜像对称/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ bool ismirrortree(struct TreeNode* p,struct TreeNode* q) { if(p NULL q NULL) return true; else if(p NULL || q NULL) return false; else if(p-val ! q-val) return false; return ismirrortree(p-left,q-right) ismirrortree(p-right,q-left); } bool checkSymmetricTree(struct TreeNode* root) { if(root NULL) return true; return ismirrortree(root-left,root-right); }3. 另一颗树的子树解题思路判断一棵树是否是另一棵树的子树需要遍历主树的每个节点检查以该节点为根的子树是否与目标子树完全相同。通过递归遍历主树对每个节点调用判断两棵树是否相同的函数。时间复杂度 O(m×n)其中 m 和 n 分别是两棵树的节点数。关键知识点双重递归外层递归遍历主树的每个节点内层递归判断两棵树是否相同相同树判断需要先实现判断两棵树是否完全相同的函数逻辑或连接当前节点开始的子树相同或者左子树包含目标子树或者右子树包含目标子树/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ bool issametree(struct TreeNode* p, struct TreeNode* q) { if(p NULL q NULL) return true; if(p NULL || q NULL) return false; if(p-val ! q-val) return false; return issametree(p-left,q-left) issametree(p-right,q-right); } bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) { if(root NULL) return false; if(subRoot NULL) return true; return issametree(root,subRoot) || isSubtree(root-left,subRoot) || isSubtree(root-right,subRoot); }4.通过前序遍历的数组ABD##E#H##CF##G##构建二叉树解题思路通过前序遍历数组构建二叉树其中 # 表示空节点。使用递归方法每次读取一个字符如果是 # 则返回 NULL否则创建新节点递归构建左子树和右子树。需要传递索引指针来跟踪当前读取位置。关键知识点前序遍历顺序根节点 → 左子树 → 右子树空节点表示通常用特殊字符如 #表示空节点索引传递需要使用指针传递索引确保递归过程中索引正确递增递归构建先创建根节点然后递归构建左子树最后递归构建右子树内存分配为每个非空节点动态分配内存注意检查分配是否成功BTNode* BinaryTreeCreate(char* a, int* pi) { if(a[(*pi)] #) { *(pi); return NULL; } BTNode* root (BTNode*)malloc(sizeof(BTNode)); root-val a[(*pi)]; root-left BinaryTreeCreate(a,pi); root-right BinaryTreeCreate(a,pi); return root; }5.判断二叉树是否是完全二叉树解题思路判断完全二叉树使用层序遍历队列实现。将根节点入队然后循环出队节点将其左右子节点入队包括空节点。当遇到第一个空节点时停止入队。继续检查队列中剩余节点如果还有非空节点则不是完全二叉树。时间复杂度 O(n)空间复杂度 O(n)。关键知识点层序遍历使用队列进行广度优先遍历完全二叉树定义除了最后一层其他层都是满的且最后一层的节点都靠左排列空节点处理需要将空节点也入队用于检测是否出现空洞队列实现需要实现队列的基本操作初始化、入队、出队、取队首、判空算法步骤1. 层序遍历直到遇到第一个空节点2. 检查队列剩余节点是否全为空//队列的初始化 void QInit(Que* pst) { assert(pst); pst-phead pst-ptail 0; pst-size 0; } //队尾数据插入 void QPush(Que* pst, QDataType x) { assert(pst); QNode* newnode (QNode*)malloc(sizeof(QNode)); if (newnode NULL) { perror(malloc failed); return; } newnode-next NULL; newnode-data x; if (pst-gt;phead NULL) pst-gt;phead pst-gt;ptail newnode; else { pst-gt;ptail-gt;next newnode; pst-gt;ptail newnode; } pst-gt;size; } //队头数据删除 void QPop(Que* pst) { assert(pst); if (pst-phead-next NULL) { free(pst-phead); pst-phead pst-ptail NULL; } else { QNode* next pst-phead-next; free(pst-phead); pst-phead next; } pst-size--; } //取队顶数据 QDataType QTop(Que* pst) { assert(pst); return pst-phead-data; } //判断队列是否为空 bool QEmpty(Que* pst) { assert(pst); return pst-size 0; } //手搓一棵二叉树 BT* BTBuyNode(BTDataType x) { BT* newnode (BT*)malloc(sizeof(BT)); if (newnode NULL) { perror(malloc failed); return NULL; } newnode-left newnode-right NULL; newnode-data x; return newnode; } //判断二叉树是否是完全二叉树 bool BinaryTreeComplete(BT* root) { Que queue; QInit(queue); QPush(amp;queue, root); while (!QEmpty(amp;queue)) { BT* cur QTop(amp;queue); QPop(amp;queue); if (cur NULL) break; QPush(amp;queue, cur-gt;left); QPush(amp;queue, cur-gt;right); } while (!QEmpty(amp;queue)) { BT* cur QTop(amp;queue); QPop(amp;queue); if (cur ! NULL) { printf(不是完全二叉树\n); return false; } } printf(是完全二叉树\n); return true; }二、总结攻破二叉树OJ题的关键在于熟练掌握基础遍历并深刻理解递归与分治的思想。建议按照本文的分类从易到难逐个击破。每做完一道题尝试用另一种遍历顺序或迭代方法重写并总结同类题目的共性。坚持练习你将对二叉树的结构和操作产生直觉在面试中游刃有余。

相关新闻

2026/8/23 8:47:38

嵌入式系统架构演进:从轮询到FreeRTOS多任务实时操作系统

1. 项目概述:为什么嵌入式系统需要FreeRTOS?如果你刚开始接触嵌入式开发,可能还在用while(1)大循环里塞满各种函数调用的方式写代码。点个灯、读个传感器、发个串口数据,全挤在一个主循环里。代码跑起来似乎也没问题,直…

2026/8/23 8:42:38

APEX框架:打造制造业自适应AI智能体的三层自进化架构

1. 项目概述:当AI智能体走进生产车间最近和几个在制造业做数字化转型的朋友聊天,大家普遍有个痛点:生产线上的AI智能体,刚上线时表现还行,但产线一换、产品型号一变,或者设备参数稍有调整,模型性…

2026/8/23 8:42:38

C++进阶:多态、模板与STL核心原理与工程实践

1. 项目概述:从“会写”到“写好”的C进阶之路 最近在重温北大郭炜老师的《程序设计与算法(三)》慕课,尤其是多态、模板和标准模板库(STL)这几块硬骨头。这让我想起很多初学C的朋友,在掌握了基本…

2026/8/23 9:57:42

大麦网抢票脚本:Python 自动抢票真能跑通吗

大麦网抢票脚本:Python 自动抢票真能跑通吗 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 开票前 5 分钟,页面已经打开,鼠标悬在按钮上方…

2026/8/23 9:57:42

Java技术栈深度面试:音视频与微服务实战设计

1. 项目概述:Java技术栈的深度面试场景设计 在技术招聘领域,如何设计能真实反映候选人工程能力的面试题一直是业界难题。这个面试场景设计项目聚焦Java技术生态,通过音视频处理和微服务架构两个典型技术方向,构建了一套层次化的能…

2026/8/23 9:57:42

从PAT真题到工程实践:浮点数精度处理与复数运算的编程实现

1. 项目概述:从一道PAT真题看复数运算的工程实现 最近在带学生刷PAT乙级(Basic Level)的题目,又碰到了那道经典的1051题——复数乘法。这道题本身在数学上并不复杂,就是两个复数相乘,然后按指定格式输出。但…

2026/8/23 9:57:42

从阿里面试题解析浮点数比较与运算符重载

1. 问题背景与面试意图解析 这道来自阿里的面试题看似简单&#xff0c;却暗藏玄机。当面试官抛出"i>j && i<j && i!j"这个条件表达式时&#xff0c;实际上是在考察候选人对以下几个维度的理解深度&#xff1a; 编程语言中比较运算符的底层实现…

2026/8/23 9:57:42

自适应多智能体脚手架:解锁大模型在复杂任务中的工程潜力

1. 从单兵作战到团队协作&#xff1a;为什么我们需要“脚手架”来解锁模型潜力最近在跟几个做AI应用落地的朋友聊天&#xff0c;大家普遍有个感觉&#xff1a;现在的大语言模型&#xff08;LLM&#xff09;&#xff0c;无论是GPT-4、Claude 3&#xff0c;还是国内的一些顶尖模型…

2026/8/23 9:52:42

多智能体隐蔽协调检测:从原理到工程实践

1. 先搞清楚这个研究到底在解决什么问题 看到“超越文本&#xff1a;检测潜在多智能体通信中的隐蔽协调”这个标题&#xff0c;很多人第一反应可能是“又一个多智能体协作的论文”。但它的核心价值不在于让智能体协作&#xff0c;而在于 如何发现和诊断智能体之间那些“看不见…

2026/8/23 0:02:04

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态&#xff0c;宏观上观察到的光是由无数个微观的光量子组成的&#xff0c;每个光子在产生的瞬间&#xff0c;其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前&#xff0c;在微观层面&#xff0c;每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:02:04

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”&#xff0c;而是SIP会话的动态重定向你有没有遇到过这样的场景&#xff1a;客服坐席A正在和客户通电话&#xff0c;突然需要把这通对话无缝转给专家坐席B&#xff0c;客户完全感知不到中间的断连——既没听到忙音&#xff0c;也没被要求重新拨号…

2026/8/23 0:02:04

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack&#xff1f;如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法&#xff0c;那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:02:04

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态&#xff0c;宏观上观察到的光是由无数个微观的光量子组成的&#xff0c;每个光子在产生的瞬间&#xff0c;其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前&#xff0c;在微观层面&#xff0c;每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:02:04

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”&#xff0c;而是SIP会话的动态重定向你有没有遇到过这样的场景&#xff1a;客服坐席A正在和客户通电话&#xff0c;突然需要把这通对话无缝转给专家坐席B&#xff0c;客户完全感知不到中间的断连——既没听到忙音&#xff0c;也没被要求重新拨号…

2026/8/23 0:02:04

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack&#xff1f;如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法&#xff0c;那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/21 15:40:01

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/23 6:14:43

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/23 4:22:01

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具&#xff0c;覆盖选题构思、文献整理、内容生成、格式排版等核心场景&#xff0c;真正帮你高效搞定论文难题。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一天定稿首…