我在限制从二叉树打印的节点数量时遇到了一些麻烦。我有当前的代码:
abp.h
struct TNodoA {
int info;
struct TNodoA *esq;
struct TNodoA *dir;
};
typedef struct TNodoA pNodoA;
void centralEsquerda(pNodoA *a, int lim);
pNodoA* InsereArvore(pNodoA *a, int ch);
abp.c
void centralEsquerda(pNodoA *a, int lim) {
if (a != NULL) {
centralEsquerda(a->esq, lim);
printf("%d, ", a->info);
centralEsquerda(a->dir, lim);
}
}
pNodoA* InsereArvore(pNodoA *a, int ch) {
if (a == NULL) {
a = (pNodoA*) malloc(sizeof (pNodoA));
a->info = ch;
a->esq = NULL;
a->dir = NULL;
return a;
} else
if (ch < a->info)
a->esq = InsereArvore(a->esq, ch);
else if (ch > a->info)
a->dir = InsereArvore(a->dir, ch);
return a;
}
主程序
int teste() {
int valores[20] = {10, 5, 15, 3, 8, 13, 18, 2, 4, 7, 9, 12, 14, 17, 19, 1, 6, 11, 16, 20};
pNodoA *arv = NULL;
for (int i = 0; i < 20; i++) {
arv = InsereArvore(arv, valores[i]);
}
centralEsquerda(arv, 4);
}
第一个想法是static int x = 0;
在centralEsquerda()
和增量中放入一些,但由于第二个递归调用(centralEsquerda(a->dir, lim)
),它不能正常工作。下面测试的代码:
void centralEsquerda(pNodoA *a, int lim) {
static int x = 0;
if (a != NULL && x < lim) {
x++;
centralEsquerda(a->esq, lim);
printf("%d, ", a->info);
centralEsquerda(a->dir, lim);
}
}
BTree 已经像每个 BTree 一样有序,左下,右下。为了以 asc 顺序打印,我使用了函数centralEsquerda()
,并以我使用的 desc 顺序打印,centralDireita()
它只是反转递归调用,它首先调用正确的节点(a->dir
)。
因此,使用上面的代码,将打印 1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20 和我希望使用centralEsquerda(node, 5)
它应该打印 1、2、3、4、5。
有任何想法吗?附言。不想使用队列/列表
[更新]
用下面的代码解决了,但我不满意......
void centralEsquerda(pNodoA *a, int lim) {
static int count = 0;
if (a != NULL) {
centralEsquerda(a->esq, lim);
if (count >= lim)
return;
else
count++;
printf("%d, ", a->info);
centralEsquerda(a->dir, lim);
}
}