我正在为二进制搜索树创建删除函数,并遇到了一个问题。
private BinaryTreeNode<T> BinaryDelete(BinaryTreeNode<T> root, T value)
{
if (root == null)
{
return root;
}
int compareResult = value.CompareTo(root.Value);
if (compareResult < 0)
{
root.Left = this.BinaryDelete(root.Left, value);
}
else if (compareResult > 0)
{
root.Right = this.BinaryDelete(root.Right, value);
}
else
{
if (root.Left == null)
{
return root.Right;
}
else if (root.Right == null)
{
return root.Left;
}
root.Value = this.FindMinLeftLeaf(root.Left);
root.Left = this.BinaryDelete(root.Left, root.Value);
}
return root;
}
private T FindMinLeftLeaf(BinaryTreeNode<T> root)
{
while (root.Left != null)
{
root = root.Left;
}
return root.Value;
}
因此,基本上,root.Value = this.FindMinLeftLeaf(root.Left);在根的左子节点中搜索。在学习期间,我看到了一些示例,这些示例是在正确的孩子中进行搜索的,因此有点令人困惑。 简而言之: 这两行应该是这样吗?
root.Value = this.FindMinLeftLeaf(root.Right);
root.Right= this.BinaryDelete(root.Right, root.Value)
还是我在第一个示例中使用它们的方式?