Leetcode 99 恢复二叉树

题目描述:

 题解:

  找规律,题目限制了只交换两个节点,那么在中序遍历的时候,用pre存中序遍历的前一个节点,如果当前节点(记为now)的值小于pre的值,那么now,pre中有一个是需要交换的节点。我们注意到,第一次出现上述情况的pre为需要交换的第一个节点,第二次出现上述情况的now节点为需要交换的第二个节点。当交换的节点为中序遍历中相邻的节点的时候,在比较的时候只会出现一次上述情况,将pre,now都记录下来即可。

AC代码:

class Solution {
public:
    TreeNode* inorder(TreeNode* root)
    {
        if(root == NULL) return NULL;
        inorder(root->left);
       // if(pre != NULL )cout << pre->val <<endl;
        if(pre != NULL)
        {
            if(pre->val > root->val)
            {
                if(flag == 0)
                {
                    node = pre;
                    node2 = root;
                    flag = 1;
                }
                else 
                {
                    node2 = root;
                    flag = 2;
                }
            }
        }
        pre = root;
        TreeNode* end = inorder(root->right);
        if(end == NULL) return root;
        return end;
    }


    void recoverTree(TreeNode* root) {
        flag = 0;
        pre = NULL;
        node = NULL;
        node2 = NULL;
        inorder(root);
       // cout << node->val << endl;
       // cout << node2->val <<endl;
        int tmp = node->val;
        node->val = node2->val;
        node2->val = tmp;
    }
private:
    int flag;
    TreeNode* node;
    TreeNode* node2;
    TreeNode* pre;
};
原文地址:https://www.cnblogs.com/z1141000271/p/12346948.html