7.二叉樹的下一個節點 ----《劍指Offer》題解(Java)

題目

題目描述
給定一棵二叉樹的其中一個節點,請找出中序遍歷序列的下一個節點。算法

樣例
假定二叉樹是:[2, 1, 3, null, null, null, null], 給出的是值等於2的節點。code

則應返回值等於3的節點。io

解釋:該二叉樹的結構以下,2的後繼節點是3。class

2
 / \
1   3

算法思路

能夠本身畫一顆樹,而後看當前節點的中序遍歷的下一個節點在哪。
有兩種狀況,一種是節點有右子樹,那麼後繼節點在右子樹的最左葉子節點;另外一種狀況是,沒有右子樹,那後繼節點可能在其祖父節點中,須要知足的狀況是,當前節點的父節點是父節點的父節點的左子樹,若不知足則繼續向上查找。二叉樹

代碼實現

class Solution {
    public TreeNode inorderSuccessor(TreeNode p) {
        if(p == null) return null;

        //1.有右子樹,則是右子樹的最左節點
        if(p.right != null) {
            p = p.right;
            while(p.left != null) p = p.left;
            return p;
        }

        //2.沒有右子樹,則找到父節點爲其父節點的左子樹
        while (p.father != null && p.father.left != p) {
            p = p.father;
        }

        //若是沒右子樹葉沒父節點,應該返回null,此時p.father也知足
        return p.father;
    }
}
相關文章
相關標籤/搜索