1. 程式人生 > 實用技巧 >LeetCode——二叉搜尋樹中的中序後繼 II

LeetCode——二叉搜尋樹中的中序後繼 II

Q:給定一棵二叉搜尋樹和其中的一個節點 node ,找到該節點在樹中的中序後繼。
如果節點沒有中序後繼,請返回 null 。
一個結點 node 的中序後繼是鍵值比 node.val大所有的結點中鍵值最小的那個。
你可以直接訪問結點,但無法直接訪問樹。每個節點都會有其父節點的引用。節點定義如下:

class Node {
    public int val;
    public Node left;
    public Node right;
    public Node parent;
}

示例 1:

輸入: tree = [2,1,3], node = 1
輸出: 2
解析: 1 的中序後繼結點是 2 。注意節點和返回值都是 Node 型別的。

示例 2:

輸入: tree = [5,3,6,2,4,null,null,1], node = 6
輸出: null
解析: 該結點沒有中序後繼,因此返回 null 。

A:

  • 若 node 結點有右孩子,則它的後繼在樹中相對較低的位置。我們向右走一次,再儘可能的向左走,返回最後所在的結點。
  • 若 node 結點沒有右孩子,則它的後繼在樹中相對較高的位置。我們向上走到直到結點 tmp 的左孩子是 node 的父節點時,則 node 的後繼為 tmp。
  public Node inorderSuccessor(Node x) {
    // the successor is somewhere lower in the right subtree
    if (x.right != null) {
      x = x.right;
      while (x.left != null) x = x.left;
      return x;
    }

    // the successor is somewhere upper in the tree
    while (x.parent != null && x == x.parent.right) x = x.parent;
    return x.parent;
  }