原题地址:https://leetcode-cn.com/problems/recover-binary-search-tree/description/
题目描述:
二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例 1:
输入: [1,3,null,null,2]
1
/
3
\
2
输出: [3,1,null,null,2]
3
/
1
\
2
示例 2:
输入: [3,1,4,null,null,2]
3
/ \
1 4
/
2
输出: [2,1,4,null,null,3]
2
/ \
1 4
/
3
进阶:
使用 O(n) 空间复杂度的解法很容易实现。
解题方案:
对二叉树进行中序遍历,预期的结果为从小到大排序的数列
参考地址:https://blog.youkuaiyun.com/a45872055555/article/details/38685035
/**
* 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(root == NULL)
return ;
InOrderTraverse(root);
}
void InOrderTraverse(TreeNode *root){
stack<TreeNode *> S;
TreeNode *p = root;
vector<int> num;
TreeNode *tmp = NULL;
TreeNode *big = NULL;
TreeNode *small = NULL;
bool flag = false;
while(p || !S.empty()){
if(p){
S.push(p);
p = p->left;
}else{
p = S.top();
S.pop();
if(tmp == NULL){
tmp = p;
p = p->right;
continue;
}
if(!flag){
if(tmp->val > p->val){
big = tmp;
small = p;
flag = true;
}
}else{
if(tmp->val > p->val){
small = p;
break;
}
}
tmp = p;
p = p->right;
}
}
int a = big->val;
big->val = small->val;
small->val = a;
}
};