這是一個在我的二進制搜索樹中添加節點的函式。如果這棵樹還沒有包含指定的元素,我怎樣才能把它改成回傳true。
private Node insertNode(Node root, Student student) {
if (root == null) {
root = new Node(student)。
}
int comp;
if (Comparator != null) {
comp = Comparator.compare(student, root.value)。
} else {
comp = student.compareTo(root.value);
}
if (comp < 0) {
root.left = insertNode(root.left, student);
} else if (comp > 0) {
root.right = insertNode(root.right, student)。
}
return root;
}
uj5u.com熱心網友回復:
如果你想這樣的話,你需要對這段代碼進行大幅度的重構。
首先搜索節點,如果它存在,則回傳false,如果不存在,則運行這段代碼,然后回傳true,可能會簡單得多。類似于:
//保持`insertNode`不變,只是命名為`createNode`。
//確保在其檔案中包含它不創建。
//如果`student`記錄在樹上已經存在。
private boolean insertNode(Student student) {
if (search(this.root, student) return false;
createNode(this.root, student)。
return true。
}
一般來說,在撰寫遞回演算法時,你幾乎總是想要2方法。實際的遞回方法是private,并且有無意義的引數,至少從API的角度來看是這樣,還有一個public,它知道必須為這些引數傳遞哪些初始值。
例如,在您的代碼中,您需要向insertNode提供Node根。從insertNode遞回程序的角度來看,這是至關重要的。然而,從外部的角度來看,這毫無意義。如果我正在為顯示所有學生的GUI前端撰寫代碼,為什么我需要提供節點?你的物件肯定是StudentTree之類的型別,它知道根節點,毫無疑問。(它應該知道,例如,作為一個欄位,如果它現在不知道的話)
當你已經有了雙重方法的設定,如果你愿意,你也可以改變回傳型別。
要清楚的是,如果不制作2個方法,這是不可行的。充其量你可以回傳一些組合物件,而不是Node,這些組合物件回傳節點以及一個布林值,然后所有的呼叫者都可以解包,但是這需要大量的努力(做一個類來表示這個,并且每次你呼叫insertNode,包括在insertNode本身,解包Node物件出來)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/333327.html
標籤:
上一篇:設定每個數字陣列的圓圈大小(最小20px,最大130px)。
下一篇:如果我在使用Arrays.sort()后試圖列印ch[0]或排序后的char陣列的任何隨機字符,它給出了一個空白輸出,因此輸出是空白的,為什么?
