C# 在二叉搜索树中添加节点

C# 在二叉搜索树中添加节点,c#,binary-search-tree,C#,Binary Search Tree,注意:这是一项家庭作业,我只想得到指导。除此之外,我不需要任何其他帮助。 我在C#中查找了如何在二叉搜索树中添加节点,但我得到了非常不同类型的答案。假设我有node类: class Node { public int value; public Node left; public Node right; public Node(int v) { value = v; left = right = null; } }

注意:这是一项家庭作业,我只想得到指导。除此之外,我不需要任何其他帮助。

我在C#中查找了如何在二叉搜索树中添加节点,但我得到了非常不同类型的答案。假设我有node类:

class Node
{
    public int value;
    public Node left;
    public Node right;

    public Node(int v)
    {
        value = v;
        left = right = null;
    }
}
以及我的add函数所在的类:

class BST
{
    public void addNode(int x, Node root)
    {
        Node newNode = new Node(x);

        if (root == null)
        {
            root = newNode;
        }
        if (root.value == newNode.value)
        {
            return;
        }
        else if (newNode.value < root.value)
        {
            if (root.left == null)
            {
                root.left = newNode;
            }
            else
            {
                addNode(x, root.left);
            }
        }
        else if (newNode.value > root.value)
        {
            if (root.right == null)
            {
                root.right = newNode;
            }
            else
            {
                addNode(x, root.right);
            }
        }
    }
}
BST类
{
公共void addNode(int x,节点根)
{
Node newNode=新节点(x);
if(root==null)
{
根=新节点;
}
if(root.value==newNode.value)
{
返回;
}
else if(newNode.valueroot.value)
{
if(root.right==null)
{
root.right=newNode;
}
其他的
{
addNode(x,root.right);
}
}
}
}

所以我现在的问题是:我很确定我大部分的逻辑都是正确的,但我怀疑的是,当我递归调用函数时,我不确定树是否会通过递归调用转到左边的子树。或者我做得对吗?

如果你认为你做得对,你应该测试一下。首先,您应该增强类,使它们更容易在调试器中可视化。显然要做的事情是向节点添加一个“ToString()”方法:

public class Node
{
    public int value;
    public Node left;
    public Node right;

    public Node(int v)
    {
        value = v;
        left = right = null;
    }

    public override string ToString()
    {
        return value.ToString();
    }
}
现在,只需将鼠标悬停在类实例上,就可以在VisualStudio中检查树的值。按照Sayse的建议,在开始构建树后,在代码中设置断点:

将鼠标悬停在根节点上。一个面板将显示“ToString()”值——实际上,由于您的“ToString()”覆盖,节点值。您还将看到一个“+”按钮。如果单击该按钮,Visual Studio将显示类实例的字段和属性,您可以递归地展开它们:

检查了调试器中的值后,您现在可能需要更复杂的方法从类中提取数据,例如返回列表中
节点中或节点下的所有值:

public class Node
{
    public IList<int> ToList()
    {
        var list = new List<int>();
        AddToList(list);
        return list;
    }

    public void AddToList(List<int> list)
    {
        if (left != null)
            left.AddToList(list);
        list.Add(value);
        if (right != null)
            right.AddToList(list);
    }
}
您还可以从调用“ToList()”方法,该方法允许您在程序在断点处停止时键入c#表达式,并对其进行解释,并以交互方式显示结果:

总之,无论何时设计新类,都要添加逻辑,以便于可视化、调试和断言代码的正确性。TobiMcNamobi提到的单元测试方法是实现这一点的正式方法,但您可以在家庭作业代码中非正式地实现


(顺便说一句,您注意到我在上面显式地分配了一个根节点,而不是使用BST类实例来创建根节点?您剩下的作业是找出原因。)

如果您认为它是正确的,您应该对它进行测试。首先,您应该增强类,使它们更容易在调试器中可视化。显然要做的事情是向节点添加一个“ToString()”方法:

public class Node
{
    public int value;
    public Node left;
    public Node right;

    public Node(int v)
    {
        value = v;
        left = right = null;
    }

    public override string ToString()
    {
        return value.ToString();
    }
}
现在,只需将鼠标悬停在类实例上,就可以在VisualStudio中检查树的值。按照Sayse的建议,在开始构建树后,在代码中设置断点:

将鼠标悬停在根节点上。一个面板将显示“ToString()”值——实际上,由于您的“ToString()”覆盖,节点值。您还将看到一个“+”按钮。如果单击该按钮,Visual Studio将显示类实例的字段和属性,您可以递归地展开它们:

检查了调试器中的值后,您现在可能需要更复杂的方法从类中提取数据,例如返回列表中
节点中或节点下的所有值:

public class Node
{
    public IList<int> ToList()
    {
        var list = new List<int>();
        AddToList(list);
        return list;
    }

    public void AddToList(List<int> list)
    {
        if (left != null)
            left.AddToList(list);
        list.Add(value);
        if (right != null)
            right.AddToList(list);
    }
}
您还可以从调用“ToList()”方法,该方法允许您在程序在断点处停止时键入c#表达式,并对其进行解释,并以交互方式显示结果:

总之,无论何时设计新类,都要添加逻辑,以便于可视化、调试和断言代码的正确性。TobiMcNamobi提到的单元测试方法是实现这一点的正式方法,但您可以在家庭作业代码中非正式地实现


(顺便说一句,您注意到我在上面显式地分配了一个根节点,而不是使用BST类实例来创建根节点?您剩下的作业是找出原因。)

如果您认为它是正确的,您应该对它进行测试。首先,您应该增强类,使它们更容易在调试器中可视化。显然要做的事情是向节点添加一个“ToString()”方法:

public class Node
{
    public int value;
    public Node left;
    public Node right;

    public Node(int v)
    {
        value = v;
        left = right = null;
    }

    public override string ToString()
    {
        return value.ToString();
    }
}
现在,只需将鼠标悬停在类实例上,就可以在VisualStudio中检查树的值。按照Sayse的建议,在开始构建树后,在代码中设置断点:

将鼠标悬停在根节点上。一个面板将显示“ToString()”值——实际上,由于您的“ToString()”覆盖,节点值。您还将看到一个“+”按钮。如果单击该按钮,Visual Studio将显示类实例的字段和属性,您可以递归地展开它们:

检查了调试器中的值后,您现在可能需要更复杂的方法从类中提取数据,例如返回列表中
节点中或节点下的所有值:

public class Node
{
    public IList<int> ToList()
    {
        var list = new List<int>();
        AddToList(list);
        return list;
    }

    public void AddToList(List<int> list)
    {
        if (left != null)
            left.AddToList(list);
        list.Add(value);
        if (right != null)
            right.AddToList(list);
    }
}
您还可以从调用“ToList()”方法,该方法允许您在程序在断点处停止时键入c#表达式,并对其进行解释和返回结果
 public void AddNode(int x, ref Node root) 
 {
     Node newNode = new Node(x);
     this->AddNode(newNode, ref root);
 }

 private void AddNode(Node newNode, ref Node root)
 {
      if (root == null) 
      {
           root = newNode;
           return;
      }
      if (root.Value == newNode.Value) 
      {
           return;
      } 
public void AddNode(int x, Node root) 
{
    Node newNode = new Node(x);
    this->AddNode(newNode, root);
}

private void AddNode(Node newNode, Node root)
{
    if (root == null) 
    {
        root = newNode;
    }
    if (root.Value == newNode.Value) 
    {
        return;
    } 
    else if (newNode.Value < root.Value) 
    {
        if (root.Left == null) 
        {
            root.Left = newNode;
        } 
        else 
        {
            AddNode(newNode, root.Left);
        }
    } 
    else if (newNode.Value > root.Value) 
    {
        if (root.Right == null) 
        {
            root.Right = newNode;
        } 
        else 
        {
            AddNode(newNode, root.Right);
        }
    }
}