[Leetcode]99. Recover Binary Search Tree

99. Recover Binary Search Tree

Two elements of a binary search tree (BST) are swapped by mistake.

Recover the tree without changing its structure.
Example 1:

Input: [1,3,null,null,2]

   1
  /
 3
  \
   2

Output: [3,1,null,null,2]
   3
  /
 1
  \
   2

Example 2:

Input: [3,1,4,null,null,2]

  3
 / \
1   4
   /
  2

Output: [2,1,4,null,null,3]
  2
 / \
1   4
   /
  3

Follow up:
A solution using O(n) space is pretty straight forward.
Could you devise a constant space solution?
题意:二叉搜索树中有两个结点顺序是逆序的,恢复二叉搜索树
思路:只需要找到两个逆序对,交换即可,代码是参照大神的

class Solution{
public:
 //firstElement和secondElement分别代表第一个逆序的位置和第二个逆序的位置
  //第一步需要在中序遍历序列中找到这两个位置,第二步需要交换这两个位置
    TreeNode *firstElement; 
    TreeNode *secondElement;
    TreeNode *preElement;   
//代表当前遍历的位置的中序前驱节点,先赋一个最小值
//traverse函数负责找到两个逆序的位置,随后用swap函数将这两个位置进行交换
    void recoverTree(TreeNode* root) {
        traverse(root);
        swap(firstElement->val, secondElement->val);
    }
    //中序遍历序列找到两个逆序的位置(找到两个逆序对即可)
    void traverse(TreeNode *root){
        if(root == NULL)
            return ;
        //中序遍历左子树
        traverse(root->left);
        if(preElement != NULL){
            //查看是否逆序,如果逆序,给firstElement和secondElement赋值
            if(firstElement == NULL && preElement->val > root->val){
                //当firstElement还没有被赋值,第一个逆序位置是pre节点
                firstElement = preElement;
            }
            if(firstElement != NULL && preElement->val > root->val){
                //当firstElement已经被赋值,第二个逆序位置是root节点
                secondElement = root;
            }
        }
        preElement = root;   //更新preElement的值
       // cout<val;
        //中序遍历右子树
        traverse(root->right);
    }
};

你可能感兴趣的:([Leetcode]99. Recover Binary Search Tree)