Waarom kan ik geen _left en _right in BinarySearchTree vinden?

stemmen
2

Ik heb een probleem met de volgende code fragment:

using System;
using System.Collections.Generic;
using System.Text;

namespace trees_by_firas
{
    class Program
    {
        static void Main(string[] args)
        {
            BinarySearchTree t = new BinarySearchTree();

            t.insert(ref t.root, 10);
            t.insert(ref t.root, 5);
            t.insert(ref t.root, 6);
            t.insert(ref t.root, 17);
            t.insert(ref t.root, 2);
            t.insert(ref t.root, 3);

            BinarySearchTree.print(t.root);
            Console.WriteLine(--------------------);
            Console.WriteLine(t.FindMax());
            Console.WriteLine(t.FindMin());
            Console.WriteLine(--------------------);
            Console.WriteLine(t.CountLeaves());
            Console.WriteLine(t.CountNodes());



        }

        public class TreeNode
        {
            public int n;
            public TreeNode _left;
            public TreeNode _right;


            public TreeNode(int n, TreeNode _left, TreeNode _right)
            {
                this.n = n;
                this._left = _left;
                this._right = _right;
            }


            public void DisplayNode()
            {
                Console.Write(n);
            }


        }


        public class BinarySearchTree
        {
            public TreeNode root;


            public BinarySearchTree()
            {
                root = null;
            }


            public void insert(ref TreeNode root, int x)
            {
                if (root == null)
                {
                    root = new TreeNode(x, null, null);
                }
                else
                    if (x < root.n)
                        insert(ref root._left, x);
                    else
                        insert(ref root._right, x);
            }

            public int FindMin()
            {
                TreeNode current = root;

                while (current._left != null)
                    current = current._left;

                return current.n;
            }

            public int FindMax()
            {
                TreeNode current = root;

                while (current._right != null)
                    current = current._right;

                return current.n;
            }



            public TreeNode Find(int key)
            {
                TreeNode current = root;

                while (current.n != key)
                {
                    if (key < current.n)
                        current = current._left;
                    else
                        current = current._right;
                    if (current == null)
                        return null;
                }
                return current;
            }



            public void InOrder(ref TreeNode root)
            {
                if (root != null)
                {
                    InOrder(ref root._left);
                    root.DisplayNode();
                    InOrder(ref root._right);
                }
            }

            public int CountNodes()
            {
                int count = 1; // me!        
                if (root._left != null)
                    count += _left.CountNodes();
                if (root._right != null)
                    count += _right.CountNodes();
                return count;
            }

            public int CountLeaves()
            {
                int count = (root._left == null && root._right == null) ? 1 : 0;
                if (root._left != null)
                    count += _left.CountLeaves();
                if (root._right != null)
                    count += _right.CountLeaves();
                return count;
            }

            public static void print(TreeNode root)
            {
                if (root != null)
                {
                    print(root._left);
                    Console.WriteLine(root.n.ToString());
                    print(root._right);
                }

            }



        }

    }
}

Ik krijg de volgende fouten:

Error 1 The name '_left' does not exist in the current context 

// on the countnodes & countleaves

Error 2 The name '_right' does not exist in the current context 
// on the countnodes & countleaves

Even welke gedachten op hoe ik deze fouten kan repareren?

De vraag is gesteld op 02/01/2009 om 14:31
bron van user
In andere talen...                            


2 antwoorden

stemmen
2

_left en _right zijn velden in TreeNode. Je probeert om ze te gebruiken alsof ze deel uitmaken van BinarySearchTree. Ik denk dat je kunt ze gewoon voorvoegsel root.:

public int CountNodes()
{
    int count = 1; // me!        
    if (root._left != null)
        count += root._left.CountNodes();
    if (root._right != null)
        count += root._right.CountNodes();
    return count;
}

public int CountLeaves()
{
    int count = (root._left == null && root._right == null) ? 1 : 0;
    if (root._left != null)
        count += root._left.CountLeaves();
    if (root._right != null)
        count += root._right.CountLeaves();
    return count;
}
antwoordde op 02/01/2009 om 14:36
bron van user

stemmen
1

Ik krijg precies het tegenovergestelde resultaat uit uw code - 6 knopen en 3 bladeren. 6 nodes is het aantal items die je in de boom hebt geplaatst, dus dit is logisch. Het aantal bladeren moet het aantal knooppunten in de boom zonder kinderen. Als uw boom ziet er momenteel als volgt uit ...

     10
    /  \
   5   17
  / \
 2   6
  \
   3

... je hebt zes knooppunten en drie bladeren (17,6 en 3).

antwoordde op 03/01/2009 om 15:41
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more