gpt4 book ai didi

c - 在 C 中打印二叉树 asc/desc 限制节点数

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:29 25 4
gpt4 key购买 nike

我在限制从二叉树打印的节点数时遇到了一些麻烦。我有当前代码:

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

主.c

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

第一个想法是在 centralEsquerda() 中放置一些 static int x = 0; 并递增,但是由于第二次递归调用(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 一样有序,左低右大。为了按升序打印,我使用了函数 centralEsquerda(),为了按降序打印,我使用了 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);
}
}

最佳答案

我讨厌我的第一个答案是未经测试的代码。请将其视为伪代码。呵呵。我认为您的解决方案(虽然功能性)并不令您满意,因为它不像您原来的递归树遍历代码那样优雅。我们这些递归爱好者往往会沉迷于这些事情。这是一个片段(未经测试),我发现递归更令人愉悦:

int centralEsquerda(pNodoA *a, int lim) {
if (a != NULL && lim > 0) {
lim = centralEsquerda(a->esq, lim);
if (lim-- > 0) printf("%d, ", a->info);
lim = centralEsquerda(a->dir, lim);
}
return lim;
}

关于c - 在 C 中打印二叉树 asc/desc 限制节点数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24131882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com