劍指offer:二叉樹的下一個節點

一、題目描述:
二、解題思路(分三種情況):
    1. 如果當前結點有右子樹
    2. 如果當前節點沒有右子樹
        (1) 如果當前節點是它父節點的左子節點
        (2)如果當前節點是它父節點的右子節點
三、代碼實現:

在這裏插入圖片描述1. 如果當前結點有右子樹

下一個節點就是它的右子樹的最左子節點(從右子節點出發一致沿着指向左子節點的指針,即可找到)
如:b ——》h, a——》f
2. 如果當前節點沒有右子樹
(1) 如果當前節點是它父節點的左子節點
下一個節點就是它的父節點
如:d——》b, f——》c, h——》e

(2)如果當前節點是它父節點的右子節點
沿着指向父節點的指針一直向上遍歷,直到找到一個是它父節點的左子節點的節點,如果這樣的節點存在,那麼這個節點的父節點就是我們要找到的下一個節點
如:i節點的下一個節點:沿着指向父節點的指針向上遍歷,先到e,e是b的右子節點,不是,繼續向上遍歷,到b, b是a的左子節點,因此節點b的父節點a就是i的下一個節點

如:g節點的下一個節點:沿着指向父節點的指針向上遍歷,先到c, c是a的右子節點,不是,繼續向上遍歷到a, a是根節點,無父節點,因此g沒有下一個節點。

給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父
結點的指針。
鏈接:https://www.nowcoder.com/questionTerminal/9023a0c988684a53960365b889ceaf5e?f=discussion
來源:牛客網

public class Solution {
    TreeLinkNode GetNext(TreeLinkNode node)
    {
        if(node==null) return null;
        if(node.right!=null){    //如果有右子樹,則找右子樹的最左節點
            node = node.right;
            while(node.left!=null) node = node.left;
            return node;
        }
        while(node.next!=null){ //沒右子樹,則找第一個當前節點是父節點左孩子的節點
            if(node.next.left==node) return node.next;
            node = node.next;
        }
        return null;   //退到了根節點仍沒找到,則返回null
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章