我该如何编写这个节点计数器?

时间:2017-11-06 22:43:44

标签: c++ binary-tree

您好我正在尝试创建一个计算二叉树中节点数的函数。我收到一个错误,指出函数不匹配。我遇到了其他错误,似乎无法让它发挥作用。我知道这个想法只是很难搞清楚这一点。谢谢!编辑 - 我的错误是参数列表不匹配。

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

2 个答案:

答案 0 :(得分:0)

本课程中有许多错误的设计和错误。我将专注于彻底的错误。我不知道你的教授强制要求哪些错误设计,哪些是你的。

目前编写的

const query = User.findOne({ name: 'foo' }) query.select('photos') 每次都会崩溃。要弄清楚原因,请仔细考虑这条线的确切作用:

BinaryTree<T>::NodeNumber

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

if (root = nullptr)

其次,线条是什么:

root = nullptr;
if (root)

root->left;

到底做什么?为什么你认为他们这样做?

最后,您何时应该添加root->right; 以及为什么?这是真的吗?

答案 1 :(得分:0)

你没有给这个函数中的第二个参数命名,我假设它应该是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-&gt; 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;
}

当然,请相应地调整声明和电话。