我的老师已经要求我在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>
答案 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);
}