剑指offer_08_二叉树的下一个节点【javascript】

160 阅读1分钟

题目

给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左右子节点的指针,还有一个指父节点的指针。

/**
 * 例如:
 *                  a
 *                /   \
 *               b     c
 *              / \    / \
 *             d   e  f   g
 *                / \
 *               h   i
 */

题解

分析

  1. 如果一个节点有右子树,那么它的下一个节点就是其右子树中的最左子节点
  2. 如果一个节点没有右子树:
    • 当前节点属于父节点的左子节点,那么它的下一个节点就是其父节点本身
    • 当前节点属于父节点的右子节点,沿着父节点的指针一直向上遍历,直至找到一个是它父节点的左子节点的节点
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = null;
 *     this.right = null;
 *     this.parent = null;
 * }
 */
  
  var getNext = (pNode) => {
    if (!pNode) return null;
    if (pNode.right) { // pNode节点有右子树,从右子节点出发一直沿着指向左子节点的指针,就能找到所求下一个节点。
      let pRight = pNode.right; // 右子节点
      while(pRight.left != null) {
        pRight = pRight.left;
      }
      return pRight;
    } else if (pNode.parent) { // pNode节点没有右子树,有父节点
      let pCurrent = pNode;
      let pParent = pNode.parent; // pNode节点是父节点的左子节点,那么它的父节点就是它的下一个节点。
      while (pParent && pCurrent === pParent.right) { 
        /**
         * pNode节点是父节点的右子节点,要沿着腹肌诶单的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点,
         * 如果这样的节点存在,那么这个节点的父节点就是要找的下一个节点
        */
        pCurrent = pParent;
        pParent = pParent.parent;
      }
      return pParent;
    }
  }