我正在尝试做作业,但我遇到了一些困难。
创建一个递归函数,在一个整数二叉树中打印一个叶子到另一个叶子之间的路径(即该树包含整数)。
int printPath(Tree * t,int a,int b)。
注意:您必须处理以下情况:
树中没有a和/或b。若然,则返回-1。
如果有,则打印值为
a
的节点与值为b
的节点之间的所有值。返回0。
我试过这段代码:
int print1(Tree* tree, int a, int b) {
int cnt;
int c = MAX(a, b), d = MIN(a, b);
a = d;
b = c;
if (!tree)
return -1;
/*
if (tree->key.id > b || tree->key.id < a) {
if(tree->key.id > b)
cnt = print(tree->left, a, b);
else
cnt = print(tree->right, a, b);
}*/
if (tree->key.id == a || tree->key.id == b) {
if (tree->key.HWGrade) {
printf("e) , %d -> ", tree->key.id);
tree->key.HWGrade = 0;
}
return 0;
}
if (tree->key.id > b) {
cnt = print1(tree->left, a, b);
if (tree->key.HWGrade) {
printf("c) , %d -> ", tree->key.id);
tree->key.HWGrade = 0;
} else
return 0;
} else {
if (tree->key.id > a) {
cnt = print1(tree->left, a, b);
if (tree->key.id != a && tree->key.id != b && !cnt) {
if (tree->key.HWGrade) {
printf("d) , %d -> ", tree->key.id);
tree->key.HWGrade = 0;
} else
return 0;
}
}
}
if (tree->key.id < a) {
cnt = print1(tree->right, a, b);
if (tree->key.id != a && tree->key.id != b && !cnt) {
if (tree->key.HWGrade) {
printf("a) , %d -> ", tree->key.id);
tree->key.HWGrade = 0;
} else
return 0;
}
} else {
if (tree->key.id < b) {
cnt = print1(tree->right, a, b);
if (tree->key.id != a && tree->key.id != b && !cnt) {
if (tree->key.HWGrade) {
printf("b) , %d -> ", tree->key.id);
tree->key.HWGrade = 0;
} else
return 0;
}
}
}
if (cnt == 0)
return 0;
return -1;
}
但它似乎不起作用。
结构使用者:
typedef struct {
int id;
int HWGrade;
int ExamGrade;
} MatamStudent;
typedef struct Tree{
int Data;
struct Link* list;
MatamStudent key;
struct Tree *left;
struct Tree *right;
} Tree;
我在Ubuntu下使用GCC和Eclipse。
答案 0 :(得分:1)
我没有看到你的数组在哪里说你的树必须被排序。一个直观的算法可能是:
a
并在p1
(大小为n
)中保存从根到此节点的路径。b
并在p2
(大小为m
)中保存从根到此节点的路径。p1[i]
和p2[i]
不同时,您可以p1
从p1[m]
到p1[i]
,第二条路径从p2[i]
到{ {1}}。该算法在p[m]
中运行,其中O(S)
是叶数。
S
答案 1 :(得分:0)
在平衡树中搜索节点的方式将与插入节点的方式相对应;如果你有一个递归函数来插入一个新值,那么你已经有了代码来找到它:)
这是一个寻找的例子;导出打印路径的代码留给学生练习:)
注意事项
每片叶子中有四种可能性: 1)叶子是你正在寻找的叶子 2)左边的叶子的id低于你要搜索的叶子,钥匙将是那片叶子的一个孩子 3)右边的叶子的id大于你要搜索的叶子 4)没有叶子,价值不存在。
您的代码比需要的复杂得多。树结构可以具有任意属性集,但它必须具有根leef。叶子结构只需要3个属性(它可以有更多,但不必有):它需要2个(对于二叉树)指向子节点的指针,它需要一个键。如果你有比这更多的数据,你就会比这更难。这是一个有趣的挑战 - 添加打印代码而不修改搜索代码;分离关注点,编程面包和黄油:)
Node* find_child(Node* parent, int id)
{
if (parent->id == id)
return parent;
else if (parent->left.id < id)
return find_child(parent->left, id);
else if(parent->right.id < id)
return find_child(parent->right, id)
else
return NULL;
}
祝你好运,我希望这会有所帮助。 :)