void MovieTree::printMovieInventory(MovieNode* node)
{
if(node)
{
while(node->rightChild!=NULL or node->leftChild!=NULL)
{
std::cout<<"Movie:"<<node->title<<" "<<node->quantity<<std::endl;
if(node->rightChild)
{
printMovieInventory(node->rightChild);
}
if(node->leftChild)
{
printMovieInventory(node->leftChild);
}
}
}
else
{
std::cout<<"No movies in list!"<<std::endl;
}
}
我不确定这个功能是否导致了我的问题,或者它是否是我的添加功能,但我觉得这个逻辑是正确的。我错过了什么吗?
编辑:: 我的问题是,它导致无限循环并且无法正确打印树的所有相关子项
答案 0 :(得分:6)
在函数中使用while
是错误的。它必须是if
。否则,该函数永远不会突破while
循环。
FWIW,该功能可以简化为:
void MovieTree::printMovieInventory(MovieNode* node)
{
if(node)
{
std::cout<<"Movie:"<<node->title<<" "<<node->quantity<<std::endl;
printMovieInventory(node->rightChild);
printMovieInventory(node->leftChild);
}
}
答案 1 :(得分:3)
除了while
循环的问题之外,这也可能永远不会打印叶节点,因为如果节点本身没有左子节点或右子节点,则不打印节点。
while(node->rightChild!=NULL or node->leftChild!=NULL)
{
std::cout<<"Movie:"<<node->title<<" "<<node->quantity<<std::endl;
应该是
if(node)
print node
if left
recurse left
if right
recurse right
答案 2 :(得分:0)
这里的情侣。
根据我的理解,您正在尝试以预购方式进行打印。 While循环是不必要的,这就是导致无限循环的原因 假设你有两个节点root和root-&gt; left 你的函数将打印root,在root&#39;上递归调用函数= root-&gt; right(这次不会打印任何内容,因为root&#39; - &gt; left为NULL而root&#39; - &gt; right为NULL)。然后函数print(root&#39;)返回其调用者print(root)。这次它不会退出while循环,因为while条件总是正确的,因此无限循环。
你可以简单地做到这一点
Print(root)
cout << root;
if(root->right != NULL)
Print(root->right);
if(root->left != NULL)
Print(root->left);
显示&#34;没有电影&#34;在调用此递归函数Print(root);
之前,只检查root == NULL