我在C#中实现了一个非常简单的BST实现。代码:
class Node
{
public int? value;
public Node parent;
public Node left;
public Node right;
public Node(int? value, Node parent = null)
{
this.value = value;
this.parent = parent;
}
}
class BST
{
public Node root;
public List<Node> tree = new List<Node>();
public BST(int? value = null)
{
if (value != null)
{
this.root = new Node(value);
this.tree.Add(this.root);
}
}
public Node insert(int value)
{
Node node = this.root;
if (node == null)
{
this.root = new Node(value);
this.tree.Add(this.root);
return this.root;
}
while (true)
{
if (value > node.value)
{
if (node.right != null)
{
node = node.right;
}
else
{
node.right = new Node(value, node);
node = node.right;
break;
}
}
else if (value < node.value)
{
if (node.left != null)
{
node = node.left;
}
else
{
node.left = new Node(value, node);
node = node.left;
break;
}
}
else
{
break;
}
}
return node;
}
}
class Program
{
static void Main()
{
BST superTree = new BST(15);
superTree.insert(14);
superTree.insert(25);
superTree.insert(2);
}
}
我的问题是关于BST类的“插入”方法。
当我在main方法中调用它时,它的“返回”究竟是如何工作的? 怎么知道把“节点”放在“左边”?我没有在任何地方引用“root.left”,但不知何故它被正确插入。
我在某种程度上意识到那里会发生某种递归,但它已经过了6个小时,我仍然无法理解这种方法是如何正常工作的。
我对“插入”方法的任何解释都表示赞赏。谢谢。
答案 0 :(得分:1)
Node node = this.root;
由于此行,您的代码始终以root身份开头。只有在node
不再为空之后才会将node
重新分配给除root之外的其他内容。其余代码适用于node.left
,但由于您的代码以root
开头,因此node.left
实际上是在开头引用root
。