1. 程式人生 > 其它 >Leetcode每日一題:22/05/16:面試題04.06:後繼者

Leetcode每日一題:22/05/16:面試題04.06:後繼者

設計一個演算法,找出二叉搜尋樹中指定節點的“下一個”節點(也即中序後繼)。如果指定節點沒有對應的“下一個”節點,則返回null

思路:二叉搜尋樹中序遍歷有序,因此:中序後繼節點,也就是比它大的最小的一個節點,

  • 若節點存在右子樹,則該最小值為右子樹的最左葉子節點
  • 若不存在右子樹,則該最小值為左子樹的父節點
  • 若不存在則null
class Solution {
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
        TreeNode parent = null, node = root;
        if (node == null) {
            return null;
        }
        while (node != null) {
            if (node.val > p.val) {//當前節點值大於指定節點值,說明指定節點在當前節點的左子樹中
                parent = node;//parent為左子樹父節點
                node = node.left;//進入左子樹
            } else if (node.val < p.val) {//當前節點值小於指定節點值,說明指定節點在當前節點的右子樹中
                node = node.right;//進入右子樹
            } else if (node.right != null) {//此時node.val=p.val,若右子樹非空,則進入右子樹
                node = node.right;
                while (node.left != null) {//找到右子樹中最左葉子節點
                    node = node.left;
                }
                return node;
            } else {//node.val = p.val且右子樹為空
                return parent;
            }
        }
        return parent;
    }
}