题意:Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
题解:因为BST中序遍历(左中右)的结果肯定组成一个上升序列。
如:1,2,3,4,5,6.
所以若节点有交换,则肯定有逆序对的存在。
如:1,5,3,4,2,6.
上例有两个相邻的逆序对,则第一个逆序对的大值和第二个逆序对的小值就是我们要求的节点。注意也可能只有一个逆序对。
代码如下:
class Solution {
public:
void searchTree(TreeNode* root, TreeNode*& pre, TreeNode*& first, TreeNode*& second) {
//pre使用引用的指针,以保持一个全局变量代表中序遍历的上一个节点
if(!root) return;
searchTree(root->left, pre, first, second);
if(root->val < pre->val) {
if(!first) {
//第一次遇到的较大值得节点
first = pre;
}
second = root;
}
pre = root;
searchTree(root->right, pre, first, second);
return;
}
void recoverTree(TreeNode* root) {
TreeNode* pre = new TreeNode(INT_MIN);
TreeNode* first(0);
TreeNode* second(0);
searchTree(root, pre, first, second);
swap(first->val, second->val);
return;
}
};

本文介绍了一种在不改变二叉搜索树结构的情况下,通过中序遍历找到并修复两个被错误交换节点的方法。利用逆序对确定被交换的节点,并通过交换其值来恢复树的正确顺序。
1037

被折叠的 条评论
为什么被折叠?



