资讯详情

LeetCode 1361:二叉树验证算法详解与实现

📅 2026/11/6 2:21:30 | 华诺云谱 👁 阅读
LeetCode 1361:二叉树验证算法详解与实现
1. 二叉树验证问题解析今天我们来深入探讨LeetCode第1361题验证二叉树节点Validate Binary Tree Nodes。这道题看似简单但实际考察了对二叉树结构的全面理解。题目要求我们根据给定的左右子节点数组判断这些节点能否构成一棵有效的二叉树。1.1 问题核心要求验证二叉树的有效性需要满足以下几个关键条件必须存在且仅存在一个根节点入度为0的节点除根节点外每个节点必须有且只有一个父节点入度为1不能存在循环引用如A是B的子节点同时B又是A的子节点从根节点出发必须能访问到所有节点连通性在实际编码面试中这类问题经常出现因为它能很好地考察候选人对数据结构基础概念的掌握程度和编码实现能力。2. 解题思路与算法设计2.1 入度统计法首先我们需要统计每个节点的入度被指向的次数。在有效二叉树中根节点的入度必须为0其他所有节点的入度必须为1vectorint inDegree(n, 0); for(int i 0; i n; i) { if(leftChild[i] ! -1) inDegree[leftChild[i]]; if(rightChild[i] ! -1) inDegree[rightChild[i]]; }2.2 根节点确认统计完入度后我们需要确认是否存在唯一的根节点int root -1; for(int i 0; i n; i) { if(inDegree[i] 0) { if(root ! -1) return false; // 多个根节点 root i; } } if(root -1) return false; // 没有根节点2.3 循环引用检测二叉树中不能存在循环引用例如A→B→A这样的情况。我们需要检查是否存在这种直接的双向引用for(int i 0; i n; i) { if(leftChild[i] ! -1 i leftChild[leftChild[i]]) return false; if(rightChild[i] ! -1 i rightChild[rightChild[i]]) return false; }2.4 连通性验证最后我们需要确认从根节点出发能够访问到所有节点。这可以通过DFS或BFS遍历来实现vectorbool visited(n, false); dfs(root, leftChild, rightChild, visited); for(bool v : visited) { if(!v) return false; }3. 完整代码实现与解析以下是完整的C解决方案包含了所有必要的验证步骤class Solution { public: void dfs(int node, vectorint leftChild, vectorint rightChild, vectorbool visited) { if(node -1 || visited[node]) return; visited[node] true; dfs(leftChild[node], leftChild, rightChild, visited); dfs(rightChild[node], leftChild, rightChild, visited); } bool validateBinaryTreeNodes(int n, vectorint leftChild, vectorint rightChild) { vectorint inDegree(n, 0); // 统计入度 for(int i 0; i n; i) { if(leftChild[i] ! -1) inDegree[leftChild[i]]; if(rightChild[i] ! -1) inDegree[rightChild[i]]; } // 确认根节点 int root -1; for(int i 0; i n; i) { if(inDegree[i] 0) { if(root ! -1) return false; // 多个根节点 root i; } } if(root -1) return false; // 没有根节点 // 检查循环引用 for(int i 0; i n; i) { if(leftChild[i] ! -1 i leftChild[leftChild[i]]) return false; if(rightChild[i] ! -1 i rightChild[rightChild[i]]) return false; } // 验证连通性 vectorbool visited(n, false); dfs(root, leftChild, rightChild, visited); for(bool v : visited) { if(!v) return false; } return true; } };4. 复杂度分析与优化4.1 时间复杂度该算法的时间复杂度主要由以下几个部分组成入度统计O(n)根节点查找O(n)循环引用检测O(n)DFS遍历O(n)总体时间复杂度为O(n)非常高效。4.2 空间复杂度空间复杂度主要来自入度数组O(n)访问标记数组O(n)DFS递归栈最坏情况下O(n)因此总空间复杂度也是O(n)。4.3 可能的优化方向虽然当前解法已经足够高效但仍有优化空间可以合并入度统计和循环引用检测的循环使用迭代DFS代替递归DFS以避免栈溢出风险在某些情况下可以提前终止检测5. 常见错误与调试技巧5.1 典型错误案例忽略多个根节点的情况忘记检查根节点自身的入度循环引用检测不完整连通性验证时未重置访问标记5.2 调试建议对于小规模测试用例手动绘制树结构验证打印中间变量如入度数组检查是否正确使用边界测试用例如空树、单节点树特别注意索引越界问题提示在解决树结构问题时画图是最有效的调试方法之一。将问题可视化能帮助你快速发现逻辑漏洞。6. 实际应用与扩展6.1 实际应用场景二叉树验证算法在实际开发中有广泛应用配置文件解析后的结构验证数据库索引结构的完整性检查UI组件树的有效性验证游戏场景中对象层次结构的检查6.2 问题变种与扩展验证N叉树的有效性验证二叉搜索树的有效性增加值大小约束验证平衡二叉树的有效性验证堆结构的有效性这类问题的核心思路都是先确认基本结构属性再验证特定约束条件。掌握基础二叉树验证方法后可以轻松扩展到更复杂的树结构验证问题。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑