一些基于二叉树的操作

时间:2014-11-29 00:01:36

标签: c++ c

您好我正在尝试在二叉搜索树中打印非叶子(内部)节点。但我没有得到所需的输出。请纠正我的错误或建议我一些更好的算法。 这是我的代码。

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

我是二元树的新手。请帮助。

3 个答案:

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

注意:我不明白的一件事是你使用临时而不是在这里。