二进制搜索树“堆栈”解释

时间:2017-10-29 13:48:57

标签: c# return binary-search-tree

我在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个小时,我仍然无法理解这种方法是如何正常工作的。

我对“插入”方法的任何解释都表示赞赏。谢谢。

1 个答案:

答案 0 :(得分:1)

Node node = this.root;

由于此行,您的代码始终以root身份开头。只有在node不再为空之后才会将node重新分配给除root之外的其他内容。其余代码适用于node.left,但由于您的代码以root开头,因此node.left实际上是在开头引用root