我有这些函数来确定是否订购了二叉树。
(假设我们已经实现了treemanagement.c,我已经修改了它来托管整数而不是字符串)
int ordtree(Treeptr p) {
int a, b;
return (p == NULL || fun(p, &a, &b));
}
int fun(Treeptr p, int * ap, int * bp) {
int a, b;
// Is 'p' a leaf?
if (p->left == NULL && p->right == NULL) {
*ap = p->value;
return 1;
}
// Does 'p' have only a left child?
if (p->right == NULL) {
*bp = p->value;
return (fun(p->left, &b, ap) && p->value > b);
}
// Does 'p' have only a right child?
if (p->left == NULL) {
*ap = p->value;
return (fun(p->right, &a, bp) && p->value < a);
}
// 'p' has two children
return (fun(p->right, &a, bp) && fun(p->left, &b, ap));
}
问题是这对于一个完美的树不起作用(所有节点都有两个子节点,因为在我的代码中没有完美树的情况下没有值检查!)。
例如,这个无序树将被评估为有序树!
4
2 6
1 8 5 7
更大的问题是,这来自测试,我不得不使用这个&#34;代码&#34;并填写GAP。
int fun(Treeptr p, .....GAP A.....)
{
int a, b;
if (p->left == NULL && .....GAP B.....) {
*ap = p->value;
.....GAP C.....
}
if (p->right == NULL) {
*bp = p->value;
return (fun(.....GAP D.....) && p->value > b);
}
if (.....GAP E.....) {
.....GAP F.....
return (fun(p->right, &a, bp) && GAP .....G.....);
}
return (.....GAP H.....);
}
任何指导?
答案 0 :(得分:1)
这是我能做的最好的代码。
int fun(Treeptr p, int * ap, int * bp) {
int a, b;
// Is 'p' a leaf?
if (p->left == NULL && p->right == NULL) {
*ap = p->value;
*bp = p->value; return 1; //gap c
}
// Does 'p' have only a left child?
if (p->right == NULL) {
*bp = p->value;
return (fun(p->left, ap, &b) && p->value > b); //gap d
}
// Does 'p' have only a right child?
if (p->left == NULL) {
*ap = p->value;
return (fun(p->right, &a, bp) && p->value < a); // gap g
}
// 'p' has two children
return (fun(p->right, &a, bp) && fun(p->left, ap, &b) && a > p->value && p->value > b); // gap h
}