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);
        }
}