题目:
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?
一个二叉搜索树的两个结点被互换了,不改变它的结构恢复二叉树。
思路:
中序遍历过程中找出这两个弄错位置的结点,然后互换这两个结点的值。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *mistake1 , *mistake2 , *pre;
void recoverTree(TreeNode* root)
{
findMistake(root);
if(mistake1 && mistake2)
swap(mistake1->val , mistake2->val);
}
void findMistake(TreeNode *root)
{
if(root == NULL)
return;
findMistake(root->left);
if(mistake1 == NULL && pre && pre->val >= root->val)
mistake1 = pre;
if(mistake1 && pre->val >= root->val)
mistake2 = root;
pre = root;
findMistake(root->right);
}
};