繁体   English   中英

确定树是否有序的功能(即BST)

[英]Function to determine if tree is ordered (i.e. a BST)

我有这些功能来确定是否有序的二叉树。

(假设我们已经实现了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

更大的问题是,这来自测试,我必须使用此“代码”并填写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.....);
}

有指导吗?

这是我能做的最好的代码。

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM