二叉樹: 找一個節點的後繼節點

 

問題描述: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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索