题目:https://leetcode-cn.com/problems/recover-binary-search-tree/
参考:https://leetcode-cn.com/problems/recover-binary-search-tree/solution/cliang-chong-fang-fa-1shi-yong-di-gui-de-zhong-xu-/
递归实现
(还可以用栈实现,不过也是O(n)空间的,此处略

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {public:/**二叉搜索树中的两个节点被错误地交换。*请在不改变其结构的情况下,恢复这棵树。*/void dfs(TreeNode *root) {if(root->left != nullptr)dfs(root->left);if(p1 == nullptr && pre->val > root->val)p1 = pre;if(p1 != nullptr && pre->val > root->val)p2 = root;pre = root;if(root->right != nullptr)dfs(root->right);}void recoverTree(TreeNode* root) {pre = new TreeNode(INT_MIN);dfs(root);swap(p1->val,p2->val);}
private:TreeNode *p1,*p2,*pre;
};

循环实现,O(1)空间

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {public:/**二叉搜索树中的两个节点被错误地交换。*请在不改变其结构的情况下,恢复这棵树。*常数空间实现,递归左子树时,将左子树*的右叶子和其父亲相连,方便回到父亲节点*/void solve(TreeNode *root) {while(root != nullptr) {if(root->left != nullptr) {tmp = root->left;while(tmp->right != nullptr && tmp->right != root)tmp = tmp->right;if(tmp->right != root) {tmp->right = root;root = root->left;}else {tmp->right = nullptr;if(p1 == nullptr && pre->val > root->val)p1 = pre;if(p1 != nullptr && pre->val > root->val)p2 = root;pre = root;root = root->right;}}else {if(p1 == nullptr && pre->val > root->val)p1 = pre;if(p1 != nullptr && pre->val > root->val)p2 = root;pre = root;root = root->right;}}}void recoverTree(TreeNode* root) {pre = new TreeNode(INT_MIN);solve(root);swap(p1->val,p2->val);}
private:TreeNode *p1,*p2,*pre,*tmp;
};

恢复二叉搜索树(常数空间实现)相关推荐

  1. LeetCode 98验证二叉搜素树(中序遍历)99恢复二叉搜索树

    微信搜一搜:bigsai 大家都在关注的刷题.学习数据结构和算法宝藏项目 关注回复进群即可加入力扣打卡群,欢迎划水.近期打卡: LeetCode 92反转链表Ⅱ&93复制ip地址&94 ...

  2. 刻意练习:LeetCode实战 -- Task24. 恢复二叉搜索树

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

  3. 99. Recover Binary Search Tree 恢复二叉搜索树

    二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2] 1/3\2 输出: [3,1,null,null,2] 3/1\2 ...

  4. 72. Leetcode 99. 恢复二叉搜索树 (二叉搜索树-中序遍历类)

    给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换.请在不改变其结构的情况下,恢复这棵树 .示例 1:输入:root = [1,3,null,null,2] 输出:[3,1, ...

  5. 【数据结构与算法】之深入解析“恢复二叉搜索树”的求解思路与算法示例

    一.题目要求 给你二叉搜索树的根节点 root ,该树中的恰好两个节点的值被错误地交换.请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入:root = [1,3,null,null,2] 输出 ...

  6. 恢复二叉搜索树Python解法

    给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换.请在不改变其结构的情况下,恢复这棵树 . 来源:力扣(LeetCode) 链接:https://leetcode-cn.c ...

  7. 99. 恢复二叉搜索树

    root 是一棵错误的二叉搜索树(有2个节点被错误交换) 发生在逆序对的头,尾这两个位置 第2个错误节点:最后一个逆序对中较小的那个节点 second /*** Definition for a bi ...

  8. [Leetcode][第99题][JAVA][恢复二叉搜索树][中序遍历]

    [问题描述][困难] [解答思路] 1. 显示中序遍历 时间复杂度:O(N) 空间复杂度:O(N) class Solution {public void recoverTree(TreeNode r ...

  9. 99. Recover Binary Search Tree(恢复二叉搜索树)

    题目链接:https://leetcode.com/problems/recover-binary-search-tree/ 思路: 看到二叉搜索树时,我想到的是中序遍历符合从大到小的原则. 然后根据 ...

  10. 深度优先搜索DFS | Morris遍历:力扣99. 恢复二叉搜索树

    1.题目描述: 2.题解: 方法1:中序遍历迭代 二叉搜索树的性质: 1.若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值: 2.若任意节点的右子树不空,则右子树上所有节点的值均大于 ...

最新文章

  1. 我终于加上博士大佬的微信!攒了近百个技术问题,一口气解决!(文末有福利)...
  2. 跳槽,你心脚同步吗?
  3. 编程之美2.10 寻找数组中的最大值和最小值
  4. 客户关系管理系统部分代码实现
  5. 《分布式操作系统》知识点(35~38)六
  6. unity 平移图片_Unity 两张背景的切换平移
  7. 别让不好意思害了你 。
  8. Material Design综合实例
  9. 82c55单片机c语言,AT89S51单片机与82C55的接口设计编程
  10. hbase入门综合概要介绍
  11. c语言上机题库大一,C语言上机题库(一).doc
  12. 微软MDT 安装与配置(二)
  13. java word书签_JAVA 创建移除Word书签
  14. vue 脚手架启动html,vue脚手架项目创建步骤详解
  15. 《仿美团》项目研发总结
  16. 诗经 - 小雅 - 六月
  17. 计算机机房网络维护日志,机房网络设备维护方案.doc
  18. matlab modis sst,MATLAB 处理 MODIS 数据(MOD04_L2)
  19. 12.5-6黄金实时指导、黄金原油操作策略及多空单解套
  20. python 二项式分布学习

热门文章

  1. HP XP7 GAD双活实现的理解
  2. Webpack之Tree Shaking与Scope Hoisting
  3. 发布项目时,出现deploy失败的情况
  4. c++ primer第五版----学习笔记(十五)Ⅱ
  5. 使用Dropzone上传图片及回显示例
  6. Quaternion类之美
  7. 右值引用带来的效率提升(C++11)
  8. “星火孵化公益计划”,为数千万华人搭建迈向Web3的桥梁
  9. K-Dimensional Foil HihoCoder - 1628 线性代数 解方程
  10. 树莓派(一) 树莓派分辨率调整(含官方默认和kali系统)