LeetCode Recover Binary Search Tree
Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
Note:A solution using O( n ) space is pretty straight forward. Could you devise a constant space solution?
BST的题目一般都是和中序遍历有关,因为他中序遍历得到的一定是有序序列。
此题就是中序遍历的过程中记录出现非递增的情况,记录下非递增的2个节点,然后交换它们的数据。
//中序遍历,p1,p2分别记录出错的两个节点
//p记录中序遍历时的前一个节点
TreeNode* p1=NULL, *p2=NULL, *p=NULL;
void recover(TreeNode* root)
{
if(NULL == root)
return ;
if(root->left != NULL)
recover(root->left);
if(p!=NULL && root->val<p->val)
{
if(p1 == NULL)
{
//p1,p2是相邻节点
p1 = p;
p2 = root;
}
else
{
//p1和p2不相邻
p2 = root;
}
}
//中序遍历的节点记录到p
p = root;
if(root->right != NULL)
recover(root->right);
}
void recoverTree(TreeNode *root)
{
if(NULL == root)
{
return ;
}
recover(root);
if(p1 && p2)
{
int v = p1->val;
p1->val = p2->val;
p2->val = v;
}
}