一,問題描述
給定一棵二叉查詢樹,以及某個結點的值。查詢該結點的下乙個結點。如果該結點是最大的,則返回 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①第3-4行是應對查詢到葉子結點的情況//採用先序遍歷查詢值為ele的結點
2private binarynode find(binarynode root, int
ele)
②第5-6行,是成功查詢到了指定結點的情況。(①②類似於先序遍歷中的訪問根結點)
③第8行,表示先在左子樹中查詢(類似於先序遍歷左子樹)
④第9-10行if表示在左子樹中未查找到該結點,則查詢右子樹⑤第11行,返回查詢的結點。若返回null,表示未找到
三,**分析
①node 節點有右孩子
1第3行,先定位到node結點的右孩子。if(node.right != null)2
8 nextnode =current;
9 }
第4行while迴圈,查詢最左下結點
②node 節點沒有右孩子時,node節點是其父結點的左孩子
1要注意第4行while迴圈中的第乙個條件:current.parent.right != nullelse
if(node.parent != null)
8 nextnode =current.parent;
9 }
為什麼不要判斷 current.parent != null 呢?因為在前面的if語句中已經判斷了(if(node.parent != null)
四,完整**實現
publicview codeclass
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);}}
五,參考資料
二叉樹的構造
二叉查詢樹的遞迴實現及遞迴分析
原文:
二叉樹的下乙個結點
這幾天由於一些原因沒及時更新部落格,抽時間來寫寫資料結構。這次是去尋找二叉樹的下乙個節點。總體思路最開始依舊是遞迴,但是比較困難,因此還是來畫圖分析。節點有指向父節點的指標next,節點類為 public class treelinknode 中序遍歷是按照 左 根 右 的規律來遍歷的。也就是如果指...
二叉樹的下乙個結點
題目描述 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。二叉樹的下乙個結點 author 過路的守望 public class getnextnode 若當前節點有右兒子,則返回右兒子的最左兒子 if node....
二叉樹的下乙個結點
題目描述 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。思路 結合圖,我們可發現分成兩大類 1 有右子樹的,那麼下個結點就是右子樹最左邊的點 eg d,b,e,a,c,g 2 沒有右子樹的,也可以分成兩類,a 是...