【LeetCode练习题】Recover Binary Search Tree

时间:2023-03-08 20:19:36
【LeetCode练习题】Recover Binary Search Tree

Recover Binary Search Tree

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

Recover the tree without changing its structure.

互换二叉搜索树中两个位置错误的节点。

思路:

预设三个指针pre,p1,p2。p1用来指向第一个出错的节点,p2用来指向第二个出错的节点。

出错情况有两种,即p1和p2相邻,p1和p2不相邻。

中序遍历此二叉树,用pre指向当前节点的上一个节点,如果出错的节点相邻,此时p1应该指向pre,p2应该指向当前节点root。

若出错节点不相邻,则用p1记录第一个出错节点pre,继续遍历到前一个节点pre大于当前节点root时,用p2指向第二个出错节点p2.

代码如下:

class Solution {
public:
TreeNode *pre,*p1,*p2; void run(TreeNode *root){
if(!root)
return;
run(root->left);
if(pre && pre->val > root->val){
if(p1 == NULL){
p1 = pre; p2 = root;
}
else{
p2 = root;
}
}
pre = root;
run(root->right);
} void recoverTree(TreeNode *root) {
if(!root)
return ;
pre = p1 = p2 = NULL;
run(root);
swap(p1->val,p2->val);
}
};