7
class Node
{
    public int data;
    public Node left, right;

    public Node(int data)
    {
        this.data = data;
        left = null;
        right = null;

    }
}

class BinaryTreeImp
{
    Node root;
    static int count = 0;

    public BinaryTreeImp()
    {
        root = null;

    }
    public Node addNode(int data)
    { 
        Node newNode = new Node(data);

        if (root == null)
        {
            root = newNode;

        }
        count++;
        return newNode;


    }

    public void insertNode(Node root,Node newNode )
    {
        Node temp;
        temp = root;

        if (newNode.data < temp.data)
            {
                if (temp.left == null)
                {
                    temp.left = newNode;

                }

                else
                {
                    temp = temp.left;
                    insertNode(temp,newNode);

                }
            }
            else if (newNode.data > temp.data)
            {
                if (temp.right == null)
                {
                    temp.right = newNode;

                }

                else 
                {
                    temp = temp.right;
                    insertNode(temp,newNode);
                }
            }
        }


    public void displayTree(Node root)
    {
        Node temp;
        temp = root;

        if (temp == null)
            return;
            displayTree(temp.left);
            System.Console.Write(temp.data + " ");
            displayTree(temp.right);


    }

    static void Main(string[] args)
    {
       BinaryTreeImp btObj = new BinaryTreeImp();
       Node iniRoot= btObj.addNode(5);


       btObj.insertNode(btObj.root,iniRoot);
       btObj.insertNode(btObj.root,btObj.addNode(6));
       btObj.insertNode(btObj.root,btObj.addNode(10));
       btObj.insertNode(btObj.root,btObj.addNode(2));
       btObj.insertNode(btObj.root,btObj.addNode(3));
       btObj.displayTree(btObj.root);

       System.Console.WriteLine("The sum of nodes are " + count);
       Console.ReadLine();

    }
}

これは実装用のコードです。コードは正常に機能しますが、displayTree 関数の場合は、次のように置き換えます。

public void displayTree(Node root)
{
    Node temp;
    temp = root;

    while(temp!=null)
    {
        displayTree(temp.left);
        System.Console.Write(temp.data + " ");
        displayTree(temp.right);
    }

}

無限ループが発生します。何が原因なのかわかりません。また、C# で BST を実装するより良い方法があるかどうかも知りたいです。

4

7 に答える 7

5

このループが必要な理由はわかりませんが、質問に答えます。

while(temp!=null)
{
    displayTree(temp.left);
    System.Console.Write(temp.data + " ");
    displayTree(temp.right);
}

tempこのコードはそうでないかどうかをチェックしますnullが、nullになることはありません。ループでは、一時的なリーフにのみ作用します。そのため、無限ループがあります。

于 2012-04-28T18:53:01.620 に答える
5

while ループも変数も必要ありませんtemp。再帰に任せてください。

public void displayTree(Node root)
{
    if(root == null) return;

    displayTree(root.left);
    System.Console.Write(root.data + " ");
    displayTree(root.right);
}
于 2012-04-28T18:56:33.197 に答える
0

https://msdn.microsoft.com/en-us/library/ms379572%28v=vs.80%29.aspxを参照してください。「BST のノードのトラバース」セクションのサンプル コードを参照してください。

また...SortedDictionaryなどをチェックすることを忘れないでください。準備が整っている必要があるBSTがあるかもしれません! https://msdn.microsoft.com/en-us/library/f7fta44c.aspx

于 2015-07-06T19:23:17.280 に答える