二叉树 求指定节点的后继节点

305 阅读1分钟

题目

一颗树的后继节点:中序遍历时,该节点的后一个;一颗树的前驱节点:中序遍历时,该节点的前一个;现有一颗二叉树,且每个节点都有一个parent指针指向父节点。求指定节点的后继节点

  • 方式一:收集中序遍历节点,然后比较节点取后一个
  • 方式二:按照中序遍历规则
    • 如果该节点有右子树:则后继节点为右子树最左边的节点
    • 如果该节点没有右子树:
      • 则应该向上取parent遍历,如果存在有节点是其上级节点的左子节点,则后继节点为该上级节点
      • 如果没有节点是其上级节点的左节点,则说明没有后继节点,返回null
function back(node) {
  if (!node) {
    return node;
  }

  if (node.right) {
    //获取右树最左边的节点
    return getLeftMost(node.right);
  } else {
    //此方式包含了没有右子树的两种情况
    let parentNode = node.parent;
    while (parentNode != null && parentNode.left != node) {
      node = parentNode;
      parentNode = node.parentNode;
    }
    return parentNode;
  }
}

function getLeftMost(node) {
  if (!node) {
    return node;
  }

  while (node.left != null) {
    node = node.left;
  }
  return node;
}