恢复二叉搜索树:恰好两个节点的值被错误地交换,请修正

99. 恢复二叉搜索树

原理:

  1. 中序遍历特性:BST的中序遍历应该是升序序列
  2. 错误检测:如果发现当前节点值小于前一个节点值,说明找到了错误位置
  3. 节点记录
    • 第一个错误节点第一次出现逆序时较大的那个节点
    • 第二个错误节点第二次出现逆序时较小的那个节点
var recoverTree = function(root) { let first = null; // 第一个错误节点 let second = null; // 第二个错误节点 let prev = new TreeNode(Number.MIN_SAFE_INTEGER); // 前一个节点 function traverse(root) { if (!root) return; traverse(root.left); // 在中序遍历位置检查是否违反BST性质 if (root.val < prev.val) { // 第一次找到逆序对时,记录第一个节点 if (first === null) first = prev; // 持续更新第二个节点 second = root; } prev = root; traverse(root.right); } traverse(root); // 交换两个错误节点的值 if (first && second) { let temp = first.val; first.val = second.val; second.val = temp; } };