递归搜索二叉树C#

时间:2015-11-13 20:35:28

标签: c# algorithm binary-tree binary-search-tree

Iam尝试Findout,如果这个程序可以检查二进制树是否是BST,

以下是代码:

myObj

我认为我的代码中缺少某些东西,例如我不认为这个代码可以在一个只有两个节点的树上工作。你能帮助我修复我的实施吗?

我也在stackoverflow

上找到了这个解决方案
public static bool isValidBST(Node root)
    {
        return isValid(root, root.Left.Value,
             root.Right.Value);
    }

    private static bool isValid(Node node, int MIN, int MAX)
    {
        // tree with no childres is BST
        if (node == null)
            return true;

        if (node.Value <= MIN || node.Value >= MAX)
            return false;

        return isValid(node.Left, MIN, node.Value) && isValid(node.Right, node.Value, MAX);    
    }

但是这对我来说不起作用!

这就是我尝试代码的方式:

private static bool isValid(Node node, int MIN, int MAX)
    {
        // tree with no childres is BST
        if (node == null)
            return true;

        if (node.Value > MIN && node.Value < MAX
            && isValid(node.Left, MIN, Math.Min(node.Value, MAX))
            && isValid(node.Right, Math.Max(node.Value, MIN), MAX))
            return true;
        else
            return false;
    }

结果是False,而它应该是True。

1 个答案:

答案 0 :(得分:3)

您的解决方案的起点有错误:

public static bool isValidBST(Node root)
{
    return isValid(root, root.Left.Value,
        root.Right.Value);
}

不要在递归函数中传递root.Left.Valueroot.Right.Value,而是发送int.MaxValueint.MinValue。这样做至少有两个很好的理由:

  • 如果根节点没有左或右子节点,则您的方法将导致NullReferenceException
  • 通过传递int.MaxValueint.MinValue,您只需要从左边和右边的子节点小于/大于其父节点,而不需要其他边界。例如,您不应该关心第一个左子项是否大于某个特定值,它只需要小于根值!通过发送int.MinValue,您可以确保它始终大于该值,因此您只需检查上限。