所以我得到了一個在Java中創建BST的任務,到目前爲止它都進展順利。但是,我有一個關於刪除方法的問題。正如我已經實現的,如果我刪除節點X,則所有節點X的子樹也將被刪除。我只是想知道這是一個常見的實現,還是我應該重新排列節點,如果我刪除一個?我也是從這個類中創建一個AVL樹,所以我需要一個trinodeRestructering方法。我想這將需要一些修改,以及如果我去和deletenodes?BST刪除方法應該刪除一個節點的子樹嗎?
Thiis是我的刪除方法是如何工作的:
private TreeNode remove(TreeNode currN, int dataToRemove) {
if (dataToRemove < currN.getData()) {
if (currN.getLeft() != null) {
if (currN.getLeft().getData() == dataToRemove) {
currN.setLeft(null);
} else {
remove(currN.getLeft(), dataToRemove);
}
}
} else if (dataToRemove > currN.getData()) {
if (currN.getRight() != null) {
if (currN.getRight().getData() == dataToRemove) {
currN.setRight(null);
} else {
remove(currN.getRight(), dataToRemove);
}
}
}
return currN;
}
//visual representation
/--------85
/--------25
/--------20
10
********************************************************************
*******removed 20******
10
*******************************************************************
爲後加入的樹:
/--------85
/--------25
\--------24
/--------20
| /--------13
\--------12
| \--------11
10(root)
下面是一些交換我試過了,看起來非常糟糕,難讀代碼:
if (dataToRemove < currN.getData()) {
if (currN.getLeft() != null) {
if (currN.getLeft().getData() == dataToRemove) {
//Om inga barn, sätt noden till null.
if(currN.getLeft().getLeft() == null && currN.getLeft().getRight() == null){
currN.setLeft(null);
}//Om noden enbart har höger barn
else if(currN.getLeft().getLeft() == null){
TreeNode old = currN.getLeft().getRight();// Gamla höger
currN.setLeft(currN.getLeft().getLeft()); //
currN.getLeft().getRight().setRight((old)); //
}//Om noden enbart har vänster barn.
else if(currN.getLeft().getRight() == null){
TreeNode old = currN.getLeft().getRight();// Gamla vänster
currN.setLeft(currN.getLeft().getLeft()); //
currN.getLeft().getLeft().setRight((old)); //
}//om två barn
else{
TreeNode oldRight = currN.getLeft().getRight();// null
currN.setLeft(currN.getLeft().getLeft()); //sätt current left till 11
currN.getLeft().setRight((oldRight)); // current left, right till 13
}
} else {
remove(currN.getLeft(), dataToRemove);
}
}
你可以,如果你的應用程序需要這種行爲,但它並不常見。它是「樹」的事實通常是無關緊要的:你只是將「一些」值存儲在「某些」數據結構中。 Java的'TreeSet'是一個二叉搜索樹;當你移除一個元素時,這並不會刪除子元素,如果是這樣的話,它將成爲PITA元素,因爲實際上看不到樹的結構以知道哪些元素將被先前刪除。 –