当前位置: 首页 > news >正文

leetcode117 填充每个节点的下一个右侧节点指针2

LeetCode 116 和 117 都是关于填充二叉树节点的 next 指针的问题,但它们的区别在于 树的类型 不同,117与 116 题类似,但给定的树是 普通二叉树(不一定完全填充),即某些节点可能缺少左或右子节点。

  • 树的结构 不保证是完美的,可能缺失某些子节点。

  • 因此,116 题的简单递归方法 不能直接适用,需要更通用的解法(如 BFS + 链表连接 或 逐层处理)。

  • 需要额外处理 子节点缺失 的情况,导致代码比 116 题复杂。

116 题的 BFS(层级遍历) 解法可以直接用于 117 题,因为 BFS 不依赖于树的完美结构,而是 逐层遍历所有节点,因此适用于 任意二叉树(包括普通二叉树和完美二叉树)。

/*
// Definition for a Node.
class Node {
public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NULL), next(NULL) {}Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}Node(int _val, Node* _left, Node* _right, Node* _next): val(_val), left(_left), right(_right), next(_next) {}
};
*/class Solution {
public:Node* connect(Node* root) {queue<Node*> q;if(root == NULL) return root;Node* node;Node* prenode;q.push(root);while(!q.empty()){int size = q.size();for(int i = 0; i < size; i++){if(i == 0){prenode = q.front();q.pop();node = prenode;}else{node = q.front();q.pop();prenode->next = node;prenode = prenode->next;}if (node->left) q.push(node->left);if (node->right) q.push(node->right);}node->next = NULL;}return root;}
};

递归:

116 题的递归解法利用了 完美二叉树的对称性

117 题的树可能 缺少左或右子节点,比如:

  • root.left 存在,但 root.right 不存在,此时 root.left.next 不能直接指向 root.right(因为 root.right 是 None)。

  • root.next 的子节点可能不存在,导致 root.right.next = root.next.left 失效。

117 题的递归解法(适用于普通二叉树)

由于树的结构不确定,我们需要:

  1. 找到当前节点的 next 节点的第一个有效子节点(可能是 next.left 或 next.right)。

  2. 递归处理右子树,再处理左子树(因为 next 链是从左到右建立的,必须先确保右侧的 next 关系已经建立)。

class Solution {
public:Node* connect(Node* root) {if (!root) return nullptr;Node* curr = root;    // 当前层的头节点Node dummy(0);        // 虚拟头节点,用于连接下一层Node* prev = &dummy;  // 用于遍历下一层while (curr) {// 遍历当前层,连接下一层if (curr->left) {prev->next = curr->left;prev = prev->next;}if (curr->right) {prev->next = curr->right;prev = prev->next;}curr = curr->next; // 移动到当前层的下一个节点// 如果当前层遍历完毕,进入下一层if (!curr) {curr = dummy.next;dummy.next = nullptr;prev = &dummy;}}return root;}
};


http://www.mrgr.cn/news/97064.html

相关文章:

  • hackmyvm-Principle
  • 《概率论与数理统计》期末复习笔记_下
  • QGIS实战系列(六):进阶应用篇——Python 脚本自动化与三维可视化
  • AI医疗诊疗系统设计方案
  • 《概率论与数理统计》期末复习笔记_上
  • Flink 1.20 Kafka Connector:新旧 API 深度解析与迁移指南
  • 函数和模式化——python
  • 低成本训练垂直领域文娱大模型的技术路径
  • 专为 零基础初学者 设计的最简前端学习路线,聚焦核心内容,避免过度扩展,帮你快速入门并建立信心!
  • TortoiseGit多账号切换配置
  • JS dom修改元素的style样式属性
  • selectdb修改表副本
  • 统计学基本原理
  • chromium魔改——navigator.webdriver 检测
  • STM32入门学习笔记(持续更新)
  • Unity中 JobSystem使用整理
  • 学透Spring Boot — 007. 七种配置方式及优先级
  • 【蓝桥杯】第十五届C++B组省赛
  • MySQL-SQL-DDL语句、表结构创建语句语法、表约束、表数据类型
  • github合并多个commit message以及rebase解决文件冲突