LeetCode——二叉搜尋樹中的中序後繼 II
阿新 • • 發佈:2020-10-15
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; }