剑指 Offer II 053. 二叉搜索树中的中序后继

100 阅读1分钟

剑指 Offer II 053. 二叉搜索树中的中序后继

给定一棵二叉搜索树和其中的一个节点 p ,找到该节点在树中的中序后继。如果节点没有中序后继,请返回 null 。

节点 p 的后继值比 p.val 大的节点中键值最小的节点,即按中序遍历的顺序节点 p 的下一个节点。

如下图方便我们理解

image.png

代码实现

找到一个节点值 大于 目标值p.val 则赋值给res,这只是暂时,如果进一步找到了当前node节点的子树,还要比目标值p.val大,则继续覆盖,如果没有则返回上一次存储的node

var inorderSuccessor = function (root, p) {
  var node = root;
  var res = null;
  while (node) {
    if (node.val > p.val) {
      res = node;
      node = node.left;
    } else {
      node = node.right;
    }
  }
  return res;
};

调试

var obj = {
  val: 5,
  left: {
    val: 3,
    left: {
      val: 1,
      left: {
        val: 0,
        left: null,
        right: null,
      },
      right: {
        val: 2,
        left: null,
        right: null,
      },
    },
    right: {
      val: 4,
      left: null,
      right: null,
    },
  },
  right: {
    val: 6,
    left: null,
    right: null,
  },
};
console.log(inorderSuccessor(obj, { val: 1, left: null, right: null }));
console.log(inorderSuccessor(obj, { val: 2, left: null, right: null }));