[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?

思路:中序递归的思路。用pre记录前一个节点,找出违反二叉搜索树规则的节点。中序遍历序列中,第一次违反二叉搜索树规则的节点的前一个节点是要修改的节点。第二次违反二叉搜索树规则的节点本身是要修改的节点.如果是中序遍历相邻的节点出错直接两次都违反。

/**
 * 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:
    void recoverTree(TreeNode* root) {
        if (root == NULL) return;
        
        stack<TreeNode*> s;
        TreeNode* p = root;
        TreeNode* pre = NULL;
        TreeNode* wrong_node1 = NULL;
        TreeNode* wrong_node2 = NULL;
        int flag = 1;
        
        while (p != NULL || !s.empty()) {
            if (p != NULL) {
                s.push(p);
                p = p->left;
            } else {
                p = s.top();
                s.pop();
                if (pre == NULL) {
                    pre = p;
                } else {
                    if (pre->val > p->val) {
                        if (flag == 1) {
                            wrong_node1 = pre;
                            wrong_node2 = p;
                            flag = 2;
                        } else {
                            wrong_node2 = p;
                        }
                    }
                    pre = p;
                }
                p = p->right;
            }
        }
        
        int temp = wrong_node1->val;
        wrong_node1->val = wrong_node2->val;
        wrong_node2->val = temp;
    }
};
原文地址:https://www.cnblogs.com/vincently/p/4240253.html