二叉樹查找前驅(qū)節(jié)點(diǎn)與后繼節(jié)點(diǎn)

前驅(qū)節(jié)點(diǎn):對(duì)一棵二叉樹進(jìn)行中序遍歷,遍歷后的順序,當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)為該節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn);

后繼節(jié)點(diǎn):對(duì)一棵二叉樹進(jìn)行中序遍歷,遍歷后的順序,當(dāng)前節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn)為該節(jié)點(diǎn)的后繼節(jié)點(diǎn);

例如一顆完全二叉樹(1,2,3,4,5,6,7),按照中序遍歷后的順序?yàn)椋海?,2,5,1,6,3,7),1節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)為:5,后繼節(jié)點(diǎn)為6.

圖1:二叉樹

若每次遍歷二叉樹進(jìn)行查找前驅(qū)節(jié)點(diǎn)或后繼節(jié)點(diǎn),復(fù)雜度太高,需要O(n)的時(shí)間復(fù)雜度。例如查找5節(jié)點(diǎn)的后繼節(jié)點(diǎn),則需要對(duì)整棵樹進(jìn)行遍歷,而真正可以做到的是,只需要經(jīng)過兩者之間的距離就可以找到其后繼節(jié)點(diǎn):5\rightarrow 2\rightarrow 1。

因此可以斷定:

前驅(qū)節(jié)點(diǎn):當(dāng)前節(jié)點(diǎn)左子樹的最右節(jié)點(diǎn)(例如1節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)為5),若無左子樹,則:當(dāng)前節(jié)點(diǎn)是其父節(jié)點(diǎn)的右子樹(5節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)為2);

后繼節(jié)點(diǎn):當(dāng)前節(jié)點(diǎn)右子樹的最左節(jié)點(diǎn)(1節(jié)點(diǎn)的后繼節(jié)點(diǎn)為6),若無右子樹,則:當(dāng)前節(jié)點(diǎn)為其父節(jié)點(diǎn)的左子樹(6節(jié)點(diǎn)的后繼節(jié)點(diǎn)為3)。

Java代碼:找后繼節(jié)點(diǎn):

public class GetSuccessposNode {//找后繼節(jié)點(diǎn)

public static class Node{

????????int value;

????????Node parent;

????????Node leftNode;

????????Node rightNode;

????????public Node(int data) {

????????????????this.value = data;

????????}

????}

public static Node getSuccessNode(Node node) {

????????if (node == null) {

????????????????return node;

????????}

????????if (node.rightNode!=null) {

????????????????return getLeftNode(node.rightNode);

????????}else {

????????????????Node parent = node.parent;

????????????????while (parent!=null && parent.leftNode!=node) {

????????????????????????node = parent;

????????????????????????parent = node.parent;

????????????????}

????????????????return parent;

????????}

}

private static Node getLeftNode(Node node) {

????????if (node == null) {

????????????????return node;

????????}

????????while (node.leftNode!=null) {

????????????????node = node.leftNode;

????????}

????????return node;

}

}

找前驅(qū)節(jié)點(diǎn):

public class GetSuccesspreNode {

????????public static class Node {

????????????????int value;

????????????????Node parentNode;

????????????????Node leftNode;

????????????????Node rightNode;

????????????????public Node(int data) {

????????????????????????this.value = data;

????????????????}

????????}

public static Node getSuccessPreNode(Node node) {

????????if (node==null) {

????????????????return node;

????????}

????????if (node.leftNode!=null) {

????????????????return getRightNode(node.leftNode);

????????}else {

????????????????Node parent = node.parentNode;

????????????????while (parent!=null && parent.rightNode!=node) {

????????????????????????node = parent;

????????????????????????parent = node.parentNode;

????????????????}

????????????????return node;

????????}

}

private static Node getRightNode(Node node) {

????????if (node==null) {

????????????????return node;

????????}

????????while (node.rightNode!=null) {

????????????????node = node.rightNode;

????????}

????????return node;

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容