尋找二叉查詢樹中的下乙個結點

2021-09-08 19:15:13 字數 3069 閱讀 9491

一,問題描述

給定一棵二叉查詢樹,以及某個結點的值。查詢該結點的下乙個結點。如果該結點是最大的,則返回 null

二,問題分析

①node 節點有右孩子

②node 節點沒有右孩子時,node節點是其父結點的左孩子。如下圖,結點8的下乙個結點是結點12

③node 節點沒有右孩子時,node節點是其父結點的右孩子,如下圖,結點14 的下乙個結點是 結點16

如何在一棵二叉樹中查詢某個結點?

可以用先序遍歷的思路。但是一定要注意遞迴的實現---第11行的 return target 是很有意義的。

在每一次的遞迴呼叫中,每個方法都有乙個自己的 target 區域性變數。如果在這個方法裡面找到了目標結點,如果沒有 return 返回的話,當遞迴回退時就會丟失「已找到的目標結點」----即上一層的 find 方法中的target 變數還是null(儘管在下一層遞迴中已經找到了目標結點)

通過第11行的 return 語句,如果在某一層還未找到目標結點,則會繼續遞迴呼叫下去,如果找到了,在 return 的時候,上一層的find方法的target變數就不會為 null ,  從而在最終 find 方法結束時,返回找到的目標結點。

1

//採用先序遍歷查詢值為ele的結點

2private binarynode find(binarynode root, int

ele)

①第3-4行是應對查詢到葉子結點的情況

②第5-6行,是成功查詢到了指定結點的情況。(①②類似於先序遍歷中的訪問根結點)

③第8行,表示先在左子樹中查詢(類似於先序遍歷左子樹)

④第9-10行if表示在左子樹中未查找到該結點,則查詢右子樹⑤第11行,返回查詢的結點。若返回null,表示未找到

三,**分析

①node 節點有右孩子

1

if(node.right != null)2

8 nextnode =current;

9 }

第3行,先定位到node結點的右孩子。

第4行while迴圈,查詢最左下結點

②node 節點沒有右孩子時,node節點是其父結點的左孩子

1

else

if(node.parent != null)

8 nextnode =current.parent;

9 }

要注意第4行while迴圈中的第乙個條件:current.parent.right != null

為什麼不要判斷 current.parent != null 呢?因為在前面的if語句中已經判斷了(if(node.parent != null)

四,完整**實現

public

class

bstnextnode

@override

public

boolean

equals(object obj)

@override

public

int hashcode()

return

result;

}@override

public

string tostring()

}private

binarynode root;

public

void buildtree(int

eles)

}private

void insert(int

ele)

private binarynode insert(binarynode root, int

ele)

else

return

root;

}//尋找值為ele的那個結點的 下乙個結點

public binarynode nextnode(int

ele)

nextnode =current;

}else

if(node.parent != null)

nextnode =current.parent;}}

else

return

nextnode;

}//查詢二叉樹中值為ele的結點,並返回該結點

private binarynode find(int

ele)

//採用先序遍歷查詢值為ele的結點

private binarynode find(binarynode root, int

ele)

//hapjin test

public

static

void

main(string args) ;

int ele = 20;

int eles = ;

bstnextnode bsttree = new

bstnextnode();

bsttree.buildtree(eles);

//構造一棵二叉樹查詢樹

binarynode next = bsttree.nextnode(ele);//

查詢值為ele結點的下乙個結點

system.out.println(next);}}

view code

五,參考資料

二叉樹的構造

二叉查詢的遞迴實現及遞迴分析

原文:

二叉樹的下乙個結點

這幾天由於一些原因沒及時更新部落格,抽時間來寫寫資料結構。這次是去尋找二叉樹的下乙個節點。總體思路最開始依舊是遞迴,但是比較困難,因此還是來畫圖分析。節點有指向父節點的指標next,節點類為 public class treelinknode 中序遍歷是按照 左 根 右 的規律來遍歷的。也就是如果指...

二叉樹的下乙個結點

題目描述 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。二叉樹的下乙個結點 author 過路的守望 public class getnextnode 若當前節點有右兒子,則返回右兒子的最左兒子 if node....

二叉樹的下乙個結點

題目描述 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。思路 結合圖,我們可發現分成兩大類 1 有右子樹的,那麼下個結點就是右子樹最左邊的點 eg d,b,e,a,c,g 2 沒有右子樹的,也可以分成兩類,a 是...