Логика проста - пересечь корень, чтобы положить конец по порядку, а затем обнулить узлы. Ниже приведен код, который я написал для удаления всех узлов дерева (т. Е. Удаления двоичного дерева).Как удалить двоичное дерево
Проблема: фактическое дерево не удаляется. Я имею в виду, что функция deleteTree (корневой каталог BTNode) содержит только нулевые значения root ref, а не head.
tree.preorder();
tree.deleteTree();
tree.preorder();- this still prints all values of a tree
Даже после выполнения tree.deleteTree() он печатает все узлы в дереве.
Может ли кто-нибудь помочь мне с тем, что ошибка в коде?
Примечание: нет ошибок в функциях вставки и предзаказа. Таким образом, вы можете просто сосредоточиться на deleteTree (код)
package com.practice;
import java.util.LinkedList;
public class BinaryTree {
private BTNode head;
public void insert(int data){
BTNode n= new BTNode (data);
BTNode temp=null;
if(head==null){
head=n;
return;
}
else{
LinkedList q= new LinkedList();
q.addLast(head); //enque
while(!q.isEmpty()){
temp=(BTNode) q.removeFirst();
if(temp.getLeft() ==null){
temp.setLeft(n);
return;
}
else{
//enque
q.addLast(temp.getLeft());
}
if(temp.getRight() ==null){
temp.setRight(n);
return;
}
else{
//enque
q.addLast(temp.getRight());
}
}//while loop ends here
}
}//insert ends here
public void preorder(){
preorder(head);
}
private void preorder(BTNode head){
if(head==null){
return;
}
else{
System.out.println(head.getData());\
preorder(head.getLeft());
preorder(head.getRight());
}
}
public void deleteTree(){
deleteTreeInternal(this.head);
}
private void deleteTree(BTNode root){
if(root == null){
return ;
}
else{
deleteTreeInternal(root.getLeft());
deleteTreeInternal(root.getRight());
root=null;
}
}
}//class ends here
package com.practice;
public class BTNode {
private BTNode left;
private BTNode right;
private int data;
public BTNode(){
}
public BTNode(int data){
this.data=data;
this.left=null;
this.right=null;
}
public BTNode getLeft() {
return left;
}
public void setLeft(BTNode left) {
this.left = left;
}
public BTNode getRight() {
return right;
}
public void setRight(BTNode right) {
this.right = right;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
}
Да, именно это я делаю, 'code'- deleteTreeInternal (root.getLeft()); deleteTreeInternal (root.getRight()); корень = null; deleteTree (корень BTNode) - удаляет все узлы корня один за другим. Но, когда я делаю preorder(), он работает. В идеале дерево должно быть удалено. –
Вы устанавливаете значение параметра функции 'root'. Это не видно за пределами функции. Вам нужно установить * корень * вашего двоичного дерева, которое называется 'head'. – dhke
см. Редактирование сделано @Naruto_Uzumaki, попробуйте это, он будет работать. –