题目:
二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例 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) 空间复杂度的解法很容易实现。
你能想出一个只使用常数空间的解决方案吗?
解题:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int midOrder(struct TreeNode **pre, struct TreeNode **err1, struct TreeNode **err2, struct TreeNode *root)
{
if (root == NULL) return 0;
if (midOrder(pre, err1, err2, root->left) == -1) return -1;
if (*pre != NULL && (*pre)->val > root->val) {
if (*err1 == NULL) {
*err1 = *pre;
*err2 = root;
} else {
*err2 = root;
return -1;
}
}
*pre = root;
if (midOrder(pre, err1, err2, root->right) == -1) return -1;
return 0;
}
void recoverTree(struct TreeNode* root){
struct TreeNode *pre = NULL;
struct TreeNode * err1 = NULL;
struct TreeNode * err2 = NULL;
midOrder(&pre, &err1, &err2, root);
int tmp;
tmp = err1->val;
err1->val = err2->val;
err2->val = tmp;
return;
}