Two elements of a binary search tree (BST) are swapped by mistake.

Recover the tree without changing its structure.

Note:
A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?

法I:BST的中序遍历结果是递增序列。把这个递增序列存储到数组中,再遍历一遍数组,便可知道swap的两个元素
class Solution {
public:void recoverTree(TreeNode *root) {vals.clear();treeNodes.clear();inorderTraverse(root);sort(vals.begin(), vals.end());for (int i = 0; i < treeNodes.size(); ++i){treeNodes[i]->val = vals[i]; //只改变值,不改结构
        }}void inorderTraverse(TreeNode* root){if (!root)return;inorderTraverse(root->left);vals.push_back(root->val);treeNodes.push_back(root);inorderTraverse(root->right);        }
private:vector<int> vals;  vector<TreeNode*> treeNodes;
};

法II:空间复杂度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 recoverTree(TreeNode* root) {TreeNode* pre = NULL;TreeNode* swap1 = NULL;TreeNode* swap2 = NULL;inOrderTraverse(root,pre,swap1,swap2);int tmp = swap1->val;swap1->val = swap2->val;swap2->val = tmp;}void inOrderTraverse(TreeNode* root, TreeNode* &pre,TreeNode* &swap1,TreeNode* &swap2){ //important to use &, otherwise new object will use a new address and the result won't bring back to caller//visit left childif(root->left) inOrderTraverse(root->left,pre,swap1,swap2);//visit rootif(pre && root->val < pre->val){swap2 = root;if(swap1==NULL) {swap1 = pre;}}pre = root;//visit right childif(root->right) inOrderTraverse(root->right,pre,swap1,swap2);}
};

转载于:https://www.cnblogs.com/qionglouyuyu/p/4854218.html

99. Recover Binary Search Tree (Tree; DFS)相关推荐

  1. LeetCode 99. Recover Binary Search Tree

    LeetCode 99. Recover Binary Search Tree 刚看到这个题真是一脸懵逼啊... 博客转载自:http://www.cnblogs.com/grandyang/p/42 ...

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

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

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

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

  4. 第五周 Leetcode 99. Recover Binary Search Tree (HARD)

    Leetcode99 给定一个 二叉搜索树,其中两个节点被交换,写一个程序恢复这颗BST. 只想到了时间复杂度O(n)空间复杂度O(h) h为树高的解法,还没想到空间O(1)的解法. 交换的情况只有两 ...

  5. 99. Recover Binary Search Tree

    一.题目 1.审题 2.分析 给出一个二叉查找树,其中有两个元素的位置弄错了,写算法将其恢复. 二.解答 1.思路: 方法一. 通过中序遍历可以确定一棵二叉查找树由小到大的顺序. 所以在此错位的查找树 ...

  6. [leetcode] Recover Binary Search Tree

    Recover Binary Search Tree Two elements of a binary search tree (BST) are swapped by mistake. Recove ...

  7. Recover Binary Search Tree

    Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...

  8. Recover Binary Search Tree,恢复二叉排序树

    问题描述:题意就是二叉树中有两个节点交换了,恢复结构. Two elements of a binary search tree (BST) are swapped by mistake. Recov ...

  9. LeetCode OJ - Recover Binary Search Tree

    题目: Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without chan ...

最新文章

  1. pyrosim有Linux版本吗,烟气流动分析软件Pyrosim版本 2020.4.092
  2. nginx注册为windows系统服务
  3. 创建css的时候选择器有哪几类,CSS3-CSS的选择器共有几类?
  4. WebBrowser,挖坑,跳坑,填坑
  5. win7驱动程序未经签名可以使用吗_手把手教你解决win7系统驱动程序签名强制禁用的设置技巧...
  6. 英特尔成立集成光电研究中心 加速光互连I/O创新
  7. ubuntu一键安装LAMP 及一键卸载
  8. [iphone-Game]物理引擎-资源整理贴 (3.14 更新)
  9. 得洲奥斯汀研究生计算机专业排名,德克萨斯大学奥斯汀分校有计算机工程专业排名...
  10. 浅尝辄止_数学建模(笔记_系统(层次)聚类算法及其SPSS实现)
  11. A. Neko Finds Grapes-奇偶的性质及运用-Codeforces Round #554 (Div. 2)
  12. Pycharm2018.2永久破解
  13. 怀旧服为什么显示服务器不兼容,《魔兽世界怀旧服》加载出错怎么办 加载出错解决方案...
  14. 武汉新时标文化传媒有限公司喜欢看短视频而不是文章?
  15. 使用JavaScript实现GPA计算器(学科实践任务 一)
  16. Springboot+thymeleaf实现excel文件上传+后台数据搜索
  17. Android移动游戏之崛起
  18. 如何在原生Android项目里嵌入Cordova
  19. 怎么样运行/调试你的PHP代码
  20. 天才程序员:我不是一个好的示范

热门文章

  1. 当下网络营销市场中为何企业可通过网络营销提升自我价值?
  2. 浅析企业开展网站建设具有哪些实际意义?
  3. 网站在改版时如何降低对排名的影响呢?
  4. c语言怎么让他变成程序,用C语言编了个程序,怎样让它点击“下一步”后继续弹出窗口...
  5. 完整计算机组成系统,计算机组成原理与完整系统结构.doc
  6. mysql ES 同步中间件
  7. python hmac
  8. CSS三栏布局的四种方法
  9. 腾讯的模板引擎---artTemplate
  10. hibernate映射(单向双向的一对多、多对一以及一对一、多对一(转)