繁体   English   中英

如何编写此节点计数器?

[英]How do I write this node counter?

嗨,我正在尝试创建一个计算二进制树中节点数的函数。 我收到一个错误消息,提示功能不匹配。 我遇到了其他错误,似乎无法正常工作。 我知道这个想法很难解决。 谢谢! 编辑-我的错误是参数列表不匹配。

template<class T>
class BinaryTree
{
 private:
   struct TreeNode
   {
      T value;
      TreeNode *left;
      TreeNode *right;
   };

   TreeNode *root;

   void insert(TreeNode *&, TreeNode *&);
   void NodeNumber(TreeNode *&, int&);  //My NodeNumber declaration
 public:
   BinaryTree()
   {
      root = nullptr;
   }

   void insertNode(T);
   int NodeNum();
};

template <class T>
void BinaryTree<T>::insertNode(T item)
{
   TreeNode *newNode = nullptr;

   newNode = new TreeNode;
   newNode->value = item;
   newNode->left = newNode->right = nullptr;

   insert(root, newNode);
}

template <class T>
void BinaryTree<T>::NodeNumber(TreeNode *&root, int&)
{
   if (root = nullptr)
      return;
   else
      root->right;
   root->left;
   count = count + 2;
}

template <class T>
int BinaryTree<T>::NodeNum()
{
   int count = 0;
   NodeNumber(root,count);
   return count;
}

在本课程中,您有许多错误的设计和错误。 我将专注于彻底的错误。 我不知道您的教授犯了哪些错误设计,哪个是您的错误设计。

当前写入的BinaryTree<T>::NodeNumber每次都会崩溃。 要弄清楚原因,请仔细考虑以下内容:

if (root = nullptr)

那条线与这两条线有何不同?

root = nullptr;
if (root)

其次,这些行是什么:

root->left;

和:

root->right;

确切地做? 您为什么认为他们这样做?

最后,您到底应该在什么时候添加count ,为什么? 那是真的吗?

您没有在此函数中为第二个参数命名,我认为应该是count

// original
template <class T>
void BinaryTree<T>::NodeNumber(TreeNode *&root, int&)
{
   if (root = nullptr)
      return;
   else
      root->right;
   root->left;
   count = count + 2;
}

一些评论:

  • 如果您有一个非空的根指针,则要访问左右两个子树。 看起来右边在“其他”情况下看起来很奇怪,而左边不是在这种情况下。 我建议摆脱“ else”,如果root为null则返回,否则在if之后左右处理。

  • 您不测试根指针是否为空; 您将其设置为null。

  • 没有理由将引用传递给根指针

  • 您的声明,例如“ root-> right”,不会做任何事情。 您想向下递归左子项,然后向下递归右子项,因此需要再次调用NodeNumber并将您的孩子作为这些递归调用的根,同时也向下传递“ count”。

  • 为什么要加2? 每个节点应仅计为1(递归向下时,其子节点将占自己的比例,因此仅为节点本身添加一个。)

  • 我更喜欢返回计数而不是使用“ out”参数

因此,请考虑以下内容:

template <class T>
int BinaryTree<T>::NodeNumber(TreeNode *root)
{
    if (root == nullptr)
        return 0;
    int count = 1;
    count += NodeNumber(root->right);
    count += NodeNumber(root->left);
    return count;
}

当然,还要调整声明并相应地调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM