1

我用 C# 编写了用于实现 AVL_trees 的代码。我遇到了一些节点问题,这就是我无法在节点中插入数据的原因。下面是我的代码。

public class avl_node
{
    public int Data;
    public avl_node Left;
    public avl_node Right;
    public int height;

    public void DisplayNode()
    {
        Console.Write("{0}", Data);
    }
}



public class avl_tree
{
    public avl_node root;

    public avl_tree()
    {
        root = null;
    }

    public void Insert(int i)
    {
        avl_node newNode = new avl_node();
        newNode.Data = i;
        newNode.height = newNode.height + 1;
        if (root == null)
        {
            root = newNode;
        }
        else
        {
            avl_node current = root;
            avl_node parent;
            while (true)
            {
                parent = current;
                if (i < current.Data)
                {
                    current = current.Left;
                    if (current == null)
                    {
                        parent.Left = newNode;
                        break;
                    }
                    else
                    {
                        current = current.Right;
                        if (current == null)
                        {
                            parent.Right = newNode;
                            break;
                        }
                    }
                }
            }
        }
    }


    public void InOrder(avl_node node)
    {
        if (!(node == null))
        {
            InOrder(node.Left);
            node.DisplayNode();
            InOrder(node.Right);
        }
    }
 }



class Program
{
    static void Main(string[] args)
    {
        avl_tree nums = new avl_tree();
        nums.Insert(23);
        nums.Insert(45);
        nums.Insert(16);
        nums.Insert(37);
        nums.Insert(3);
        nums.Insert(99);
        nums.Insert(22);
        avl_node nd = new avl_node();
        nd = nums.Search(37);

        Console.WriteLine("Inorder traversal: ");
        nums.InOrder(nums.root);
    }
}

我得到的只是一个黑色的控制台屏幕。我很困扰。

希望得到更好的回应。

问候乌默尔

4

2 回答 2

1

“我得到的只是一个黑色的控制台屏幕”

插入 23 后,您的 Insert() 方法会卡在 while 循环中,因为 45永远不会小于 23:

        while (true)
        {
            parent = current;
            if (i < current.Data)
                // you never get in here, so we just loop around in "while (true)"  
于 2013-05-05T02:16:52.877 回答
1

看一下 insert 方法中的那个循环,每次尝试插入大于树中现有值的任何值时,您都会陷入循环。

它会因为这个条件而发生:if(i < current.data)。else 语句在哪里?你把它放在提到的条件范围内。所以它永远不会到达,因此程序将运行无限循环。

您应该在 else 语句之前放置一个“}”,这样 else 将超出第一个 if 语句的范围。并删除方法末尾的“}”之一。

这样它应该运行得很好。

于 2013-05-05T02:48:18.157 回答