問題描述:node
有一種新的二叉樹節點類型,結點中包含了一個指向父節點的parent指針(都能正確指向,頭結點的parent指向null),算法
只給一個在二叉樹中的某個節點node,實現返回node後繼節點的函數。ide
知識點:在二叉樹的「中序遍歷」的序列中,node的下一個節點叫作node的「後繼節點」,上一個節點叫node的「前驅節點」。函數
算法實現:this
//結點spa
class Node {
public int value;
public Node left;
public Node right;
public Node parent;
public Node(int value) {
this.value = value;
}
@NonNull
@Override
public String toString() {
return "Node [value = " + value + "]";
}
}
//方法
public Node getNextNode(Node node) {
if(node == null) {
return node;
}
if(node.right != null) {
return getLeftMost(node.right);
} else {
Node parent = node.parent;
while (parent != null && parent.left != node) {
node = parent;
parent = node.parent;
}
return parent;
}
}
public Node getLeftMost(Node node) {
if(node == null) {
return node;
}
while (node.left != null) {
node = node.left;
}
return node;
}
算法解析:.net
1.首先判斷結點是否爲空,爲空則直接返回null(在算法中,「null」判斷既是必要廚師判斷操做,也是重要的終止條件判斷)指針
2.若是當前結點的右節點不爲null,則後繼結點必然在右子樹中,code
(1)若是此右節點有左子樹,則遍歷此左子樹直到最下層左葉子節點;get
(2)若是此右節點無左子樹,則當前結點即爲要尋找的後繼結點。
3.若是當前結點的右節點爲null,則後繼結點是當前結點的某個父節點(或者當前結點爲最後一個節點,不存在後繼節點)
(1)找到當前結點的父結點;
(2)當父節點不爲空,且當前節點不是父節點的左節點時,須要向上迭代查找;
(3)向上查找時,將找到的父節點轉化爲子節點,尋找其父節點,並判斷是否知足(2)中條件,知足則終止,返回父節點(即爲要找的節點);
(4)若是直到父節點爲null時,都沒有能知足(2)中條件,說明待查找的節點沒有後繼地點(已是最後一個節點)。
本文分享 CNBlog - 黑冰臺。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。