C++ 一些基于二叉树的操作
您好,我正在尝试打印二进制搜索树中的非叶(内部)节点。但是我没有得到想要的输出。请纠正我的错误或建议我一些更好的算法。 这是我的密码C++ 一些基于二叉树的操作,c++,c,C++,C,您好,我正在尝试打印二进制搜索树中的非叶(内部)节点。但是我没有得到想要的输出。请纠正我的错误或建议我一些更好的算法。 这是我的密码 void noleaf(struct node *here) { if((temp -> left != NULL) || (temp -> right != NULL)) { printf("%d" , temp -> data) ; if(temp -> left != NUL
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 ;
}
}
我不熟悉二叉树。请提供帮助。打印树时是否确实需要区分非叶节点?我已经对您的指令进行了重新排序(并且省略了一个返回值——您的编译器应该警告您这一点)
您的逻辑如下所示:
- 如果节点至少有一个子节点,则打印其数据,然后
- 如果节点有一个左子节点,则递归到该子节点
- 然后,递归到正确的子级,不管它是否存在
- 如果它是一个叶,请执行叶处理(所有情况下都是通用的)
- 否则,
- 执行内部节点处理,然后递归到子树(预排序),或
- 递归到子树中,然后执行内部节点处理(postorder),或
- 递归到左子树,然后执行内部节点处理,然后递归到右子树(按顺序)
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);
}
}
对于noleaf函数,您必须检查此处是否为NULL(如果此处为NULL->左或此处->右将导致分段错误或错误),然后必须检查此处是否有子,如果它至少有一个,则我们不在叶中,如果是,则打印节点的内容
void noleaf(struct node * here) {
if (here)
if (here->left || tree->right) {
printf("%d\n",here->data);
noleaf(here->left);
noleaf(here->right);
}
}
注意:有一件事我不明白,那就是你为什么使用temp而不在这里。在
noleaf()中的之前是否应该有一个与if(temp->left)
匹配的if(temp->left)
?与中一样,当前可以在temp->right==NULL
时调用它。为什么在这里使用temp
而不是?
void noleaf(struct node * here) {
if (here)
if (here->left || tree->right) {
printf("%d\n",here->data);
noleaf(here->left);
noleaf(here->right);
}
}