[英]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.