【Lintcode】448. Inorder Successor in BST

題目地址:

https://www.lintcode.com/problem/inorder-successor-in-bst/description

給定一棵BST,再給定樹中的一個節點pp,求中序遍歷中pp的後繼節點。

中序遍歷pp的後繼節點,等價於整棵樹中比pp大的所有節點中最小的數。這道題和以下這題Inorder Predecessor in BST很像,參考:https://blog.csdn.net/qq_46105170/article/details/105885857。思路是新開一個指針跟在root後面,然後根據rootrootpp的關係決定向哪個方向走。如果rootroot小於等於pp,那麼整棵左子樹都比pp更小,所以不可能在左子樹裏,rootroot向右走一步;如果rootroot大於pp,那麼就新開一個指針succsucc跟在rootroot後面,然後將rootroot向左走。如果pp本身就是最大值,那麼最終rootroot會一路向右走到null,此時succsucc維持默認值null,所以可以返回succsucc;如果pp無右子樹,那麼rootroot會拐到pp右邊成爲nullnull,此時succsuccpp的右父親,也是返回succsucc;如果pp有右子樹,那麼rootroot會拐到pp的右子樹,然後succsucc跟在後面一路向左走,走到最後一個節點的時候就可以返回succsucc(此時rootroot成爲null)。代碼如下:

public class Solution {
    /*
     * @param root: The root of the BST.
     * @param p: You need find the successor node of p.
     * @return: Successor of p.
     */
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
        // write your code here
        TreeNode succ = null;
        while (root != null) {
            if (root.val <= p.val) {
                root = root.right;
            } else {
            	// 此時root.val > p.val
                succ = root;
                root = root.left;
            }
        }
        
        return succ;
    }
}

class TreeNode {
    int val;
    TreeNode left, right;
    
    TreeNode(int x) {
        val = x;
    }
}

時間複雜度O(h)O(h),空間O(1)O(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章