一些基于二叉树的操作

Some binary tree based operations

本文关键字:操作 二叉树      更新时间:2023-10-16

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

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

我是二叉树的新手.请帮忙。

你的逻辑看起来像这样:

  • 如果节点至少有一个子节点,请打印其数据,然后
    • 如果节点有一个左子节点,则递归到该节点
  • 然后,递归到正确的子项,无论它是否存在。

我想你会同意,只打印至少有一个子节点的节点,并且对待一个子节点与另一个子节点不同,这是不公平的。

二叉树上的递归通常采用以下形式之一:

    如果是叶子
  • ,请进行叶子处理(所有情况都通用(

  • 否则,要么

    • 执行内部节点处理,然后递归到子树(预购(,或
    • 递归到子树中,然后执行内部节点处理(后序(,或
    • 递归到左侧子树,然后
    • 执行内部节点处理,然后递归到右侧子树(按顺序(。

因此,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);
    }
}

打印树时真的有必要区分非叶节点吗?我已经重新排序了您的指令(并省略了返回值 - 您的编译器应该警告您(。

void printree(struct node *here)
{
    if (here != NULL)
    {
        printree (here->left);
        printf("%dn", here -> data) ;
        printree (here->right);
    }    
}

对于 noleaf 函数,您必须检查此处是否不是 NULL(如果它是 NULL 这里>左或这里>右会导致分段错误或错误(,然后你必须检查这里是否有儿子,如果它至少有一个,那么我们不在叶子中,如果我们是,那么我们打印节点的内容。

void noleaf(struct node * here) {
    if (here)
        if (here->left || tree->right) {
            printf("%dn",here->data);
            noleaf(here->left);
            noleaf(here->right);
        }
}

注意:我不明白的一件事是你为什么使用temp而不是这里。