您好我正在尝试创建一个计算二叉树中节点数的函数。我收到一个错误,指出函数不匹配。我遇到了其他错误,似乎无法让它发挥作用。我知道这个想法只是很难搞清楚这一点。谢谢!编辑 - 我的错误是参数列表不匹配。
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;
}
答案 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;
}
当然,请相应地调整声明和电话。