【问题标题】:Why can't I find _left and _right in BinarySearchTree?为什么我在二叉搜索树中找不到左右?
【发布时间】:2010-09-29 05:44:02
【问题描述】:

以下代码 sn-p 有问题:

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);
                }

            }



        }

    }
}

我收到以下错误:

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

关于如何修复这些错误有什么想法吗?

【问题讨论】:

    标签: c# binary-tree binary-search-tree


    【解决方案1】:

    我从您的代码中得到了完全相反的结果——6 个节点和 3 个叶子。 6 个节点是您插入到树中的项目数,所以这是有道理的。叶子数应该是树中没有子节点的节点数。因为你的树目前看起来像这样......

         10
        /  \
       5   17
      / \
     2   6
      \
       3
    

    ...你有六个节点和三个叶子(17,6 和 3)。

    【讨论】:

      【解决方案2】:

      _left 和 _right 是 TreeNode 中的字段。您尝试将它们当作 BinarySearchTree 的一部分来使用。我相信你可以在它们前面加上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;
      }
      

      【讨论】:

      • 不行,那我会收到一个错误错误不包含'CountLeaves'的定义
      • 确实如此。所以要么你需要实现 TreeNode.CountLeaves/CountNodes,要么让 CountNodes/CountLeaves 带一个参数——要计数的节点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      相关资源
      最近更新 更多