您好我正在尝试在二叉搜索树中打印非叶子(内部)节点。但我没有得到所需的输出。请纠正我的错误或建议我一些更好的算法。 这是我的代码。
void noleaf(struct node *here)
{
if((temp -> left != NULL) || (temp -> right != NULL))
{
printf("%d" , temp -> data) ;
if(temp -> left != NULL)
{
noleaf(temp -> left) ;
}
}
noleaf(temp -> right) ;
return 0 ;
}
另一个功能要求我打印树的镜像。我在这里使用过。
struct node *Mirror(struct node *t)
{
if(t == NULL)
{
return 0 ;
}
else
{
nn = (struct node *)malloc(sizeof(struct node)) ;
nn -> data = t -> data ;
nn -> left = Mirror(t -> right);
nn -> right = Mirror(t -> left) ;
return nn ;
}
}
我是二元树的新手。请帮助。
答案 0 :(得分:2)
你的逻辑是这样的:
我认为您同意只打印至少有一个孩子的节点,并且对一个孩子的处理方式与另一个孩子不同,这是不公平的。
二叉树的递归通常采用以下形式之一:
如果是叶子,请进行叶片处理(所有情况都相同)
否则,
因此noleaf
的前序遍历版本可能是
void noleaf(struct node *here)
{
if (here == NULL)
{
// Do nothing
}
else
{
printf("%d", here->data);
noleaf(here->left);
noleaf(here->right);
}
}
或简化
void noleaf(struct node *here)
{
if (here)
{
printf("%d", here->data);
noleaf(here->left);
noleaf(here->right);
}
}
答案 1 :(得分:1)
在打印树时是否真的有必要区分非叶节点?我已经重新排序了你的指令(并省略了一个返回值 - 你的编译器应该已经警告过你了。)
void printree(struct node *here)
{
if (here != NULL)
{
printree (here->left);
printf("%d\n", here -> data) ;
printree (here->right);
}
}
答案 2 :(得分:1)
对于noleaf函数,你必须检查这里是否为NULL(如果它在这里是NULL-> left或here-> right会导致分段错误或错误),那么你必须检查这里是否有儿子,如果它确实至少有一个那么我们就不在叶子里,如果我们那么我们就打印出节点的内容。
void noleaf(struct node * here) {
if (here)
if (here->left || tree->right) {
printf("%d\n",here->data);
noleaf(here->left);
noleaf(here->right);
}
}
注意:我不明白的一件事是你使用临时而不是在这里。