我正在尝试使用c#从二叉树中删除节点。此示例仅在节点没有子节点时才有效。我理解删除如何与孩子们一起工作,但是我对这个问题感到困惑,这似乎是因为我对c#缺乏了解:
public class Tree
{
internal class Node
{
public int Val { get; set; }
public Node Left { get; set; }
public Node Right { get; set; }
public Node(int val)
{
Val = val;
}
}
private Node root;
public void Delete(int val)
{
Node current = this.root;
Node parent = null;
while (true) {
if (val < current.Val) {
parent = current;
current = current.Left;
}
else if (val > current.Val) {
parent = current;
current = current.Right;
}
else if (val == current.Val) {
current = null;
return;
}
}
}
}
我的问题是在我设置current = null的行中。我打算使用它的方法是使用current = null来删除当前节点。但它不起作用。如果我从父节点引用当前节点:
parent.Right = null;
节点被正确删除,但显然很痛苦,因为我需要检查当前节点是否是节点的右子节点。我错过了什么?提前谢谢!
答案 0 :(得分:0)
你不能这样做。
current
变量是与parent.Left
或parent.Right
变量分开的变量。
执行此操作时:
current = parent.Left;
您正在复制变量的值,而不是将一个变量链接到另一个变量。你可以把它比作postit notes。在一个便条纸上你有一个地址,然后你执行上面的声明并将地址复制到另一个便条纸上。之后更改副本不会以任何方式或形状改变原始音符。
所以是的,您需要跟踪来自哪个子引用变量current
。