Question 99– Recover Binary Search Tree
交换了一个BST二叉查找树的两个元素,要求恢复该BST
算法
base:因为二叉查找树的中序遍历结果是升序排列的,所以交换任意两个元素后,交换中的小元素被交换到序列的后面,大元素被交换到序列的前面。
算法过程伪代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
//algorithm recoverTree
input: BST根指针root
output: 恢复过的BST根指针root
first: the first exchanged node
second: the second exchanged node
pre: the previous node
//中序遍历BST
inordertraver(root)
swap the val of first and second
function inordertraver(root)
if(root == NULL) then
return;
endif
inordertraver(root->left)
将第一个pre->val > root->val 的 pre赋给first
将每次出现的pre->val > root->val 的 root赋给second
pre := root
inordertraver(root->right)
end function
C++ Code
class Solution {
public:
void recoverTree(TreeNode* root) {
TreeNode *pre=NULL, *first=NULL, *second=NULL;
inordertraver(root, pre, first, second);
if(first!=NULL){
int temp = first->val;
first->val = second->val;
second->val = temp;
}
//delete pre; //不能用delete,因为没有new,main函数结束时会自动释放其中的局部变量,加上该delete,就会释放两次,所以有错
//delete first;
//delete second;
}
private:
void inordertraver(TreeNode* root, TreeNode* &pre, TreeNode* &first, TreeNode* &second){
if(root==NULL) return;
//访问左子树
inordertraver(root->left, pre, first, second);
if(pre!=NULL&&first==NULL&&pre->val>root->val) first = pre;
if(first!=NULL&&pre->val>root->val) second = root;
pre = root;
//访问右子树
inordertraver(root->right, pre, first, second);
}
};
不能使用delete
时间复杂度
O(|V|), V是BST中的节点数