题目:
参考:
http://blog.163.com/ya_mzy/blog/static/19959325520137153340725/
中序遍历 得到的正好是有序数组,如果发生无序, 记录节点,最后交换。
代码:
class Solution {
public:
TreeNode *node1, *node2, *pre;
void recoverTree(TreeNode *root) {
node1 = node2 = pre = NULL;
inorder(root);
swap(node1->val, node2->val);
}
private:
void inorder(TreeNode *root)
{
if (root == NULL)
return;
//中序遍历
if (root->left)
inorder(root->left);
//如果pre节点存在
if (pre)
{
//如果发生顺序颠倒
if (pre->val > root->val)
{
//如果是第一次颠倒
if (node1 == NULL)
{
//记录两个颠倒的值,有可能正好是发生交换的两个值
node1 = pre;
node2 = root;
}
else
{
//记录第二次发生颠倒的后一个值
node2 = root;
}
}
}
//更新pre 对于中序遍历,pre = root
pre = root;
if (root->right)
inorder(root->right);
}
};