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].付东来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shenmingik

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值