从二叉搜索树中删除节点时遇到问题。我想我还没有理解Java对象如何工作的基本原理
节点类:-从二叉搜索树中删除节点时遇到问题。我想我还没有理解Java对象如何工作的基本原理,java,object,data-structures,binary-search-tree,Java,Object,Data Structures,Binary Search Tree,节点类:- public class Node { int data; Node left; Node right; Node(int data){ this.data = data; left = null; right = null; } } BST等级:- public class BST { Node root; BST(){ root = null; }
public class Node {
int data;
Node left;
Node right;
Node(int data){
this.data = data;
left = null;
right = null;
}
}
BST等级:-
public class BST {
Node root;
BST(){
root = null;
}
void insertNode(int data){
root = insertRecursive(data, root);
}
private Node insertRecursive(int data , Node root){
if(root == null) return new Node(data);
if(data < root.data) root.left = insertRecursive(data,root.left);
if(data > root.data) root.right = insertRecursive(data,root.right);
return root;
}
Node find(int data,Node root){
return findRecursive(data,root);
}
private Node findRecursive(int data, Node root){
if(data == root.data) return root;
if(data < root.data) return findRecursive(data,root.left);
if(data > root.data) return findRecursive(data, root.right);
else return null;
}
Node delete(int data, Node root){
Node toBeDeleted = find(data,root);
Node parent = parent(data,root);
if(toBeDeleted.left == null && toBeDeleted.right == null) {
toBeDeleted = null;
return root;
}
else if(toBeDeleted.left == null || toBeDeleted.right == null){
if(toBeDeleted.left == null){
if(parent.left == toBeDeleted) parent.left = toBeDeleted.right;
if(parent.right == toBeDeleted) parent.right = toBeDeleted.right;
}
else if(toBeDeleted.right == null ){
if(parent.left == toBeDeleted) parent.left = toBeDeleted.left;
if(parent.right == toBeDeleted) parent.right = toBeDeleted.left;
}
return root;
}
else {
Node min = findMin(toBeDeleted.right);
toBeDeleted = min;
delete(min.data,min);
return root;
}
}
Node parent(int dataToBeFound,Node root){
return parentHelper(find(dataToBeFound,root),root);
}
private Node parentHelper(Node nodeToBeFound, Node root){
if(root == null ) return null;
else {
if(root.left == nodeToBeFound || root.right == nodeToBeFound) return root;
else{
if(nodeToBeFound.data < root.data) return parentHelper(nodeToBeFound,root.left);
else return parentHelper(nodeToBeFound,root.right);
}
}
}
void levelOrder(Node root){
Queue<Node> q = new LinkedList<>();
q.add(root);
while(!q.isEmpty()){
Node node = q.poll();
System.out.println(node.data);
if(node.left != null ) q.add(node.left);
if(node.right != null ) q.add(node.right);
}
}
Node findMin(Node node){
if(node.left == null) {
return node;
}
else{
return findMin(node.left);
}
}
}
删除后,我将返回与输出相同的BST。我知道我缺少一些关于对象如何工作或对象如何被引用的基本知识。我的问题是我不知道如何解决这个问题。我该怎么办?我应该创建一个新对象吗?还是怎样我不知道。我认为这部分有问题:
if(toBeDeleted.left == null && toBeDeleted.right == null) {
toBeDeleted = null;
return root;
}
因为您对父项不做任何操作。因为我将其子项设置为null,父项的子项在默认情况下不会变为null吗?您只将某些局部变量设置为null,而不是父项的子项。
if(toBeDeleted.left == null && toBeDeleted.right == null) {
toBeDeleted = null;
return root;
}