99. Recover Binary Search Tree

来源:互联网 发布:手机贴膜品牌 知乎 编辑:程序博客网 时间:2024/06/05 09:18

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?

BST的两个数交换了,修复BST。总体思路就是中序遍历,找到BST的两个错误的节点,然后交换数值。值得注意的是,错误的节点有两种情况,比如开始中序遍历为1,2,3,4,5
1、中序遍历相邻,比如1,3,2,4,5。此时中序遍历只会存在一次错误。
2、中序遍历不相邻,比如1,4,3,2,5.此时中序遍历会出现两次错误。
所以在实际处理时,在遇到第一次错误时,记录两个节点;如果之后还有错误,更新节点。

public class Solution {    TreeNode m1, m2;       //错误的两个值    TreeNode pre;          //前一个节点,用于和当前节点比较,找出错误节    //findMistake功能:中序遍历,找出两个错误节点    void findMistake(TreeNode root) {          if(root != null){            findMistake(root.left);            if(pre != null && pre.val > root.val){                if(m1 == null){     //第一次遇到错误,记录两个节点                    m1 = pre;                    m2 = root;                }                else{              //再次出现错误,更新错误节点                    m2 = root;                }            }            pre = root;            findMistake(root.right);        }    }      public void recoverTree(TreeNode root) {         findMistake(root);          if(m1 != null && m2 != null) {        //交换两个错误节点             int tmp = m1.val;              m1.val = m2.val;              m2.val = tmp;          }      }  }
0 0