恢复二叉搜索树

解题思路:

  1. 中序遍历BST,依次访问的节点值是递增的,错误的BST会破坏递增性,从而能定位出错误,错误有两种:

    • 错误1:出现了两对不满足前小后大,需要交换第一对的第一个元素与第二对的第二个元素;
    • 错误2:只出现一对不满足前小后大,交换这一对元素即可;
  2. 比较前后访问的节点值,prev 保存上一个访问的节点(中序遍历是递增的,所以上一个节点永远小于当前节点),当前访问的是 root 节点;

    • 每访问一个节点,如果 prev.val>=root.val,就找到了一对“错误对”;
    • 检查一下它是第一对错误对,还是第二对错误对;
  3. 遍历结束,就确定了待交换的两个错误点,进行交换;

复杂度:

  1. 时间复杂度:O(n),n 是节点个数;

  2. 空间复杂度:O(n),递归栈的深度;

代码实现:

const recoverTree = (root) => {
  // 上一个访问的节点
  let perv = new TreeNode(-Infinity);
  // 错误节点
  let err1, err2 = null;

  // 中序递归遍历
  const inOrder = (root) => {
    if (root == null) {
      return;
    }
    inOrder(root.left);
    if (perv.val >= root.val && err1 == null) { // 当前是第一对错误
      err1 = perv; // 记录第一个错误点
    }
    if (perv.val >= root.val && err1 != null) { // 第一个错误点已确定
      err2 = root; // 记录第二个错误点
    }
    perv = root; // 更新 perv
    inOrder(root.right);
  };

  inOrder(root);
  // 交换两个错误位置的节点
  [err1.val, err2.val] = [err2.val, err1.val];
};
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 恢复二叉搜索树
  2. 2. 解题思路:
  3. 3. 复杂度:
  4. 4. 代码实现: