给你二叉搜索树的根节点 root
,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树 。
思路一:模拟题意
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;
}
分析:
本题要将错误交换的两个数交换回来,即可能有两种情况,一是两个值所在的节点相邻,只有一对错误值,将错误值的两个数交换位置即可,二是两个值所在的节点不相邻,即有两对错误值,将第一对错误值前面的数和第二对错误值后面的数交换位置即可解决。
总结:
本题考察二叉树交换值的应用,分类讨论错误的情况再加以解决即可做出