二叉搜索树查找值是否存在

时间:2017-09-24 02:20:30

标签: c# nodes

尝试学习树节点......

    Binary search tree (BST) is a binary tree where the value of each node is larger or equal to the values in all the nodes in that node's left subtree and is smaller than the values in all the nodes in that node's right subtree.

Write a function that checks if a given binary search tree contains a given value.

For example, for the following tree:

n1 (Value: 1, Left: null, Right: null)
n2 (Value: 2, Left: n1, Right: n3)
n3 (Value: 3, Left: null, Right: null)
Call to Contains(n2, 3) should return true since a tree with root at n2 contains number 3.

到目前为止,我得到了......

 public class BinarySearchTree
    {
        public static bool Contains(Node root, int value)
        {
            foreach (var v in root)
            {
                if (root.Value == value)
                {
                    //value found return true
                }
            }
        }

        public static void Main(string[] args)
        {
            Node n1 = new Node(1, null, null);
            Node n3 = new Node(3, null, null);
            Node n2 = new Node(2, n1, n3);

            Console.WriteLine(Contains(n2, 3));
        }
    }

但是root标记为不可用,如果我做root。我得到选项tostring,value,left,right。

我可以不像列表一样遍历节点吗? 如何检查root中是否找到值? 谢谢

更新 啊,好的...感谢juharr的回复所以我已经将我的代码更新为......

public static bool Contains(Node root, int value)
            {
                    if (root.Value == value)
                    {
                        return true;
                    }
                    else if (root.Value > value)
                    {
                        if (root.Right == null)
                        {
                            Contains(root.Left, value);
                        }
                        Contains(root.Right, value);
                    }
                    else //(root.Value < value)
                    {
                        if (root.Left == null)
                        {
                            Contains(root.Right, value);
                        }

                        Contains(root.Left, value);
                    }

                return false;
            }

然而在第二个循环中,圆根为空并导致崩溃?

2 个答案:

答案 0 :(得分:6)

你关闭了,但这就是你真正想要的

public static bool Contains(Node root, int value)
{
    if (root == null) return false;
    if (root.Value == value) return true;
    if (root.Value > value) return Contains(root.Left, value);
    return Contains(root.Right, value);
}

因此,如果rootnull,则没有数字,因此您返回false。然后检查值是否匹配,如果匹配则返回true。然后,如果root的值较大,则返回左子树上的递归调用的结果。最后,您只需在右子树上返回递归调用的结果,因为此时您知道根值较小。

这是一种非递归的搜索方式

public static bool Contains(Node root, int value)
{
    while(root != null)
    {
        if(root.Value == value) return true;
        if(root.Value > value) root = root.Left;
        else root = root.Right;
    }

    return false;
}

此处我们循环直到我们点击null节点,并根据比较将root设置为LeftRight,或者立即返回true Value是匹配的。如果我们将它设置为循环,则找不到该值。

答案 1 :(得分:0)

  

我可以不像列表一样遍历节点吗?

可以遍历BST - 使用堆栈传递子节点将有助于此(如所示here)。因此,您可以将root的子项放入堆栈,然后将其值与目标value进行比较。

话虽如此,可以说是更直观的方法来递归 - 理论上你会检查当前节点的值,然后递归调用Contains - 将它传递给当前节点的right或者left孩子,直到找到目标Value,或者不是。{/ p>

在任何一种方法中,您都希望利用您在问题中指出的BST的优势:

  

二进制搜索树(BST)是一个二叉树,其中每个节点的值大于或等于该节点左子树中所有节点中的值,并且小于该节点右子树中所有节点中的值

考虑到这一点,您将能够在O(log n)时间内通过“切断”您不需要检查的值来实现它(由于当前节点的值与您的目标相关value 1}})。