[leetcode][BST] Recover Binary Search Tree
2015-07-02 13:13
417 查看
题目:
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? //还没想到
分析:本质中序遍历序列是排序的。
当前值比前一个值小时,若还没找到第一个数,则前一个值就是第一个发生逆序的值;若已经找到第二个数,则当前值就是第二个发生逆序的值。
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? //还没想到
分析:本质中序遍历序列是排序的。
当前值比前一个值小时,若还没找到第一个数,则前一个值就是第一个发生逆序的值;若已经找到第二个数,则当前值就是第二个发生逆序的值。
/** * 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) { if (NULL == root || NULL == root->left && NULL == root->right) return; stack<TreeNode *> sta; TreeNode *p = root; bool foundFirst = false;//是否已找到第一个逆序元素 TreeNode *lastNode = NULL; TreeNode *nextNode = NULL;//用于处理当中序遍历序列相邻两个元素交换的情况 TreeNode *p1 = NULL, *p2 = NULL; while (p != NULL || !sta.empty()){ while (p != NULL){ sta.push(p); p = p->left; } TreeNode *q = sta.top(); sta.pop(); if (lastNode != NULL && q->val < lastNode->val){ if (!foundFirst){ p1 = lastNode; nextNode = q; foundFirst = true; } else if(lastNode != p1){ p2 = q; break; } } lastNode = q; p = q->right; } if (NULL == p2) p2 = nextNode; int tmp = p1->val; p1->val = p2->val; p2->val = tmp; } };
相关文章推荐
- 要乐观对待生活
- rsyslog 8.11.0 (v8-stable) 发布
- UNIX多线程编程
- 145.删除字符串前导和后导‘*’号
- HDOJ----------1009
- 获取指定月 获取指定日期是星期几
- MongoDB应用——查询
- 畅想未来
- 通过startActivityForResult来调用Activity
- android 背景音乐的实现
- 深度优先搜索-炸弹人问题
- acm 推荐题
- HashMap实现原理分析
- ant 自动化编译
- PL/SQL 命名规范
- js 设置Cookie 在PHP中读取(大师手法)
- 安卓作业—自动登录
- override 和 overload的区别(较全面)
- 修复XCode7 Beta版无法使用iOS8.4真机调试的Bug
- 手机移动端web 禁止手机返回功能的最好方法,虽然很变态,但是很有效.