Data structures 二叉搜索树的查找祖先方法不工作
我已经编写了在C#(C-sharp)中查找节点父节点的方法,但是我的代码工作不正常。异常:尝试删除其父节点为null的节点时,将引发System.NullReferenceExceptionData structures 二叉搜索树的查找祖先方法不工作,data-structures,parent,binary-search-tree,nullreferenceexception,Data Structures,Parent,Binary Search Tree,Nullreferenceexception,我已经编写了在C#(C-sharp)中查找节点父节点的方法,但是我的代码工作不正常。异常:尝试删除其父节点为null的节点时,将引发System.NullReferenceException public TreeNode FindParent(int value, ref TreeNode parent) { TreeNode currentNode = root; if (currentNode == null) {
public TreeNode FindParent(int value, ref TreeNode parent)
{
TreeNode currentNode = root;
if (currentNode == null)
{
return null;
}
while (currentNode.value != value)
{
if (value < currentNode.value)
{
parent = currentNode;
currentNode = currentNode.leftChild;
}
if (value > currentNode.value)
{
parent = currentNode;
currentNode = currentNode.rightChild;
}
}
return currentNode;
}
public void Delete(int value)
{
TreeNode parent = null;
TreeNode nodeToDelete = FindParent(value, ref parent);
if (nodeToDelete == null)
{
throw new Exception("Unable to delete node: " + value.ToString());
}
//CASE 1: Nod has 0 children.
if (nodeToDelete.leftChild == null && nodeToDelete.rightChild == null)
{
if (parent.leftChild == nodeToDelete)
{
parent.leftChild = null;
}
if (parent.rightChild == nodeToDelete)
{
parent.rightChild = null;
}
count--;
return;
}
//CASE 2: Nod has 1 left || 1 right barn
if (nodeToDelete.leftChild == null && nodeToDelete.rightChild != null)
{
nodeToDelete.rightChild = parent.rightChild;
nodeToDelete = null;
count--;
return;
}
if (nodeToDelete.leftChild != null && nodeToDelete.rightChild == null)
{
nodeToDelete.leftChild = parent.leftChild;
nodeToDelete = null;
count--;
return;
}
//CASE 3: Nod has 2 children
if (nodeToDelete.rightChild != null && nodeToDelete.leftChild != null)
{
TreeNode successor = LeftMostNodeOnRight(nodeToDelete, ref parent);
TreeNode temp = new TreeNode(successor.value);
if (parent.leftChild == successor)
{
parent.leftChild = successor.rightChild;
}
else
{
parent.rightChild = successor.rightChild; nodeToDelete.value = temp.value;
}
count--;
return;
}
}
public树节点FindParent(int值,ref树节点父节点)
{
TreeNode currentNode=根节点;
if(currentNode==null)
{
返回null;
}
while(currentNode.value!=值)
{
if(值当前节点值)
{
父节点=当前节点;
currentNode=currentNode.rightChild;
}
}
返回当前节点;
}
公共无效删除(int值)
{
TreeNode父节点=null;
TreeNodeToDelete=FindParent(值,参考父级);
if(nodeToDelete==null)
{
抛出新异常(“无法删除节点:+value.ToString());
}
//案例1:Nod有0个子项。
if(nodeToDelete.leftChild==null&&nodeToDelete.rightChild==null)
{
if(parent.leftChild==nodeToDelete)
{
parent.leftChild=null;
}
if(parent.rightChild==nodeToDelete)
{
parent.rightshild=null;
}
计数--;
返回;
}
//案例2:Nod有一个左| |一个右谷仓
if(nodeToDelete.leftChild==null&&nodeToDelete.rightChild!=null)
{
nodeToDelete.rightChild=parent.rightChild;
nodeToDelete=null;
计数--;
返回;
}
if(nodeToDelete.leftChild!=null&&nodeToDelete.rightChild==null)
{
nodeToDelete.leftChild=parent.leftChild;
nodeToDelete=null;
计数--;
返回;
}
//案例三:诺德有两个孩子
if(nodeToDelete.rightChild!=null&&nodeToDelete.leftChild!=null)
{
树节点后继节点=LeftMostNodeOnRight(nodeToDelete,ref-parent);
树节点温度=新树节点(后续值);
if(parent.leftChild==继任者)
{
parent.leftChild=继任者.rightChild;
}
其他的
{
parent.rightChild=succession.rightChild;nodeToDelete.value=temp.value;
}
计数--;
返回;
}
}
由于您使用的是递归,因此不需要父节点来删除二元搜索树中的节点,这里有一个delete方法,您可以在其中传入int和root
private BinaryTreeNode remove (int value, TreeNode t){
if(t==null)
return t; // not found; do nothing
if(value < t.value){
t.left = remove(x,y,t.left);
}
else if (value > t.value){
t.right = remove(x,y,t.right);
}
else if( t.left!=null && t.right != null) // two children
{
t.info = findMin(t.right).info;
remove(t.info.getLastName(),y,t.right);
}
else{ // one child
if (t.left != null) {
t = t.left;
}
else{
t = t.right;
}
}
return t;
}
因此,您从右子树中获取最小值,并使其成为t.info的父级。遵循这些图表。我们正在删除带有两个子节点的节点25
t.Info=findMin(t.right).Info//Info在这里和findMin都代表什么?一条建议——在学习编程时,你应该先学习调试——这会让你有机会在发布之前回答一些无关紧要的问题:)我觉得你的评论没有建设性。如果你没有任何贡献,请不要发表评论。当然,我正在尽我最大的努力进行调试,请详细描述你这样评论时的推理方式
private BinaryTreeNode findMin ( BinaryTreeNode t){ // recursive
if(t == null)
return null;
else if (t.left == null)
return t;
return findMin(t.left);
}