这个C代码如何在原位反转二叉树?

时间:2017-06-19 20:42:08

标签: c pointers data-structures binary-tree

我的老师已经要求我在C中编写一个反映二叉树的函数,我的意思是反转树。 我一直在努力解决这个问题,因为解决方案对我没有任何意义。 我们使用的数据结构如下:

typedef struct nodo {

  int valor;

  struct nodo *esq, *dir;
} *ABin;

,解决方案是:

void mirror (ABin *a) {

    ABin c = *a;
   if (c == NULL);

    else {
        ABin e = c -> esq;
        ABin d = c -> dir;
        c -> esq = d;
        c -> dir = e;
        mirror (&(c -> esq));
        mirror (&(c -> dir)); 
    }
}

我最关心的是指针的使用与否。我不明白为什么,当我们递归调用函数时,当&esq已经指向dir类型时,我们必须使用struct nodo?< / p>

4 个答案:

答案 0 :(得分:1)

您问题的更高级别答案是,通过递归交换每个节点的左右子树,您可以反转树的排序不变量。

通常,二叉搜索树维护每个左后代命令比当前节点更早(或等于)的不变量,而每个右后代根据树的排序函数命令稍后(或等于)当前节点。通过在树中的每个节点交换左右子树,可以反转树的排序不变量。

关于指针间接级别的问题,镜像函数没有充分理由采用ABIN指针。它应该只是一个ABIN,因为它是typedef指向树节点的指针。更好的是,你(或你的老师)在没有充分理由的情况下,不会首先为指向结构的指针创建一个typedef。

答案 1 :(得分:0)

您只需要交换指针(即使其中一个是NULL)

struct node {
        struct node *prev;
        struct node *next;
        int key;
        char payload[123];
        };

void mirror(struct node *ptr)
{
struct node *tmp;

if (!ptr) return;

tmp = node->prev;
node->prev = node->next;
node->next= tmp;

mirror(node->prev);
mirror(node->next);
}

答案 2 :(得分:0)

正如您所见, esq dir 指向 struct nodo 的指针。

使用typedef struct nodo{} *ABin使ABin类型也指向 struct nodo

所以

ABin相当于struct nodo *(类型)。

因此,对于您的函数void mirror (ABin *a) a 将是指向指针的指针。

parameter a  is struct nodo** // pointer to a  pointer

您的函数必须修改指针本身,因此您必须传递其地址;这就是你用&amp; 调用函数的原因。

答案 3 :(得分:0)

您正在为指针创建一个typedef。

 typedef struct nodo* ABin;

这要求混淆!事实上,它似乎让你感到困惑,因为

void mirror(ABin*)

相同
void mirror(struct nodo**)

并没有理由增加额外的间接层。您可以将其更改为

void mirror(ABin)

但最好避免首先使用typedefs作为指针。

清理:

typedef struct Nodo {
    int valor;
    struct Nodo* esq;
    struct Nodo* dir;
} Nodo;

void mirror(Nodo* nodo) {
    if (nodo == NULL)
        return;

    Nodo* tmp = nodo->esq;
    nodo->esq = nodo->dir;
    nodo->dir = tmp;

    mirror(nodo->esq);
    mirror(nodo->dir); 
}