C 函数确定树是否已排序(即BST)

C 函数确定树是否已排序(即BST),c,binary-search-tree,ordered-tree,C,Binary Search Tree,Ordered Tree,我有这些函数来确定二叉树是否有序 (假设我们已经实现了,我已经将其修改为宿主整数而不是字符串) 一个更大的问题是,这来自一个测试,我不得不使用这个“代码”来填补空白 int fun(Treeptr p, .....GAP A.....) { int a, b; if (p->left == NULL && .....GAP B.....) { *ap = p->value; .....GAP C..... } if (p->rig

我有这些函数来确定二叉树是否有序

(假设我们已经实现了,我已经将其修改为宿主整数而不是字符串)

一个更大的问题是,这来自一个测试,我不得不使用这个“代码”来填补空白

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

有什么指导吗?

这是我能做的最好的代码

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
}
intfun(treeptrp,int*ap,int*bp){
INTA,b;
//“p”是一片叶子吗?
如果(p->left==NULL&&p->right==NULL){
*ap=p->value;
*bp=p->value;返回1;//间隙c
}
//“p”只剩下一个孩子了吗?
如果(p->right==NULL){
*bp=p->value;
返回(乐趣(p->left,ap和b)&&p->value>b);//差距d
}
//“p”只有一个合适的孩子吗?
如果(p->left==NULL){
*ap=p->value;
return(fun(p->right,&a,bp)&&p->valueright,&a,bp)&&fun(p->left,ap,&b)&&a>p->value&&p->value>b);//间隙h
}

为什么需要这么多参数?只要按顺序比较一下键就足够了。这也让我困惑@hustmphrr!!因为这是一个测试问题,我必须使用我在问题的最后一段代码中提供的框架。我也不知道代码试图做什么<代码>ap和
bp
是不对称的。关于完美树问题。为什么不添加更多的条件<代码>bvalue&&p->value@HuStmpHrrr到目前为止,我觉得这个角色扮演着最小值和最大值的角色。好主意。你的意思是将它们放在最后一次返回中?@hustmphrr如何在不破坏给定骨架的情况下进行此操作?谢谢你的尝试!然而,这是行不通的。以我问题中的树为例,将节点8替换为3。您提供的函数将此树计算为无序,而它是有序的:/@萨马拉斯哦,我颠倒了比较符号。现在它应该可以工作了。我展示了这些迹象,我怀疑这一点,但我也想测试一下答案。我不仅接受这一点,但我会投票的任何其他我觉得好在您的个人资料!非常感谢。
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.....);
}
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
}