IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode —— 99. 恢复二叉搜索树 -> 正文阅读

[数据结构与算法]LeetCode —— 99. 恢复二叉搜索树

题目描述

给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树 。

示例

示例一

在这里插入图片描述
输入:root = [1,3,null,null,2]
输出:[3,1,null,null,2]
解释:3 不能是 1 的左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。

示例二

在这里插入图片描述
输入:root = [3,1,4,null,null,2]
输出:[2,1,4,null,null,3]
解释:2 不能在 3 的右子树中,因为 2 < 3 。交换 2 和 3 使二叉搜索树有效。

解题思路

首先我们要明白BST的特性之一就是其中序遍历的结果是顺序的!那么我们就可以利用中序遍历的思想了。

首先我们需要一个变量prev_node其指向当前节点的上一个节点,当然其一开始是指向root节点的。之后我们遍历这个二叉树。如果我们发现当前节点的元素是小于上一个节点的,那么说明我们定位到了错误的节点!用两个指针保存当前节点和前一个节点的地址。

之后,我们遍历完,用刚刚的两个指针把这两个节点的val值交换就可以。

代码

class Solution {
 public:
  TreeNode* prev_node = nullptr;  //保存前一个节点
  TreeNode* pre_node = nullptr;  //当找到错误节点时,定位前一个节点的地址
  TreeNode* cur_node = nullptr;  //当找到错误节点时,定位当前节点的地址

  /**
   * @brief 遍历节点,定位到错误节点
   *
   * @param node 当前节点的地址
   */
  void traverse(TreeNode* node) {
    if (node == nullptr) return;

    traverse(node->left);

    //找到错误节点
    if (prev_node != nullptr && prev_node->val > node->val) {
      if (pre_node == nullptr) pre_node = prev_node;
      cur_node = node;
    }
    prev_node = node;

    traverse(node->right);
  }

  /**
   * @brief leetcode 提供的函数
   *
   * @param root 根节点
   */
  void recoverTree(TreeNode* root) {
    if (root == nullptr) return;
    traverse(root);
    swap(pre_node->val, cur_node->val);
  }
};

参考文献

[1] labuladong的算法小抄[M].付东来

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-28 12:10:13  更:2022-01-28 12:10:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 19:36:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码