【问题标题】:Find out if the leaves of a BST terminate at the same level找出 BST 的叶子是否在同一级别终止
【发布时间】:2014-11-29 21:27:05
【问题描述】:

我正在处理一个 BST,我想编写一个函数来检查所有叶子是否都在同一级别终止。

我的第一个想法是获取左右子树的高度并查看它们是否相等,但是我意识到这是一种错误的方法,因为我可以有一个场景,即 root 的右孩子可以为 null 并且左子树上的叶子在同一层终止。

现在我有点迷失如何解决这个问题。

我的代码

int isCompleteBst(struct tree *t)
{
  if(t->root == NULL)
  {
    return 0;
  }
  else
  {
    return isCompleteBst_r(t->root);
  }
}
int isCompleteBst_r(struct leaf *lf)
{
   if(geHeight(lf->left) == getHeight(lf->right))
   {
     return 1;
   }
   else
   {
     return 0;
   }
}

【问题讨论】:

  • 那么你对这个反例的预期输出是什么?
  • 在这种情况下,我的逻辑将返回 0(false) 但是我应该得到 1(true)
  • 你不能只写一个递归算法吗?你的数据结构是什么样的?你有第一次尝试的示例代码吗?您能否编辑您的问题并添加这两个部分。
  • @Soren 我发布了我拥有的代码,但不幸的是这是一个错误的方法..
  • @user2733436 -- 递归应该为每个子树做出部分决定,然后将信息向上传递 -- 请参阅我在下面提供的答案

标签: c binary-tree binary-search-tree


【解决方案1】:

首先获取任意一片叶子的深度并将其存储。它将用于比较。

然后通过树递归:

如果你发现一个节点的两个子节点都有效,继续递归。

如果你碰到一个左右子节点都为 NULL 的节点,你找到了叶子,将当前深度与存储的深度进行比较。如果不匹配,则停止递归并返回 false。否则继续在左右孩子中递归。

如果你命中一个有一个子 NULL 和一个有效的节点,停止递归,因为深度显然不匹配,并返回 false。

如果您从未遇到错误条件,则默认返回 true。

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多