【问题标题】:How to check if a binary tree is complete in Java如何在Java中检查二叉树是否完整
【发布时间】:2021-04-23 21:36:46
【问题描述】:

我在完成这项任务时遇到了很多麻烦。使用 Wikipedia 定义的完整二叉树:

完全二叉树是一种二叉树,其中除了可能的最后一层之外,每一层都被完全填满,并且所有节点都尽可能靠左

我需要一种方法来检查这些条件,但无论我如何尝试,我似乎都无法提出任何建议。如果我要将TreeNode tree 输入传递给checkComplete 方法,我该如何遍历二叉树并检查它是否完整?任何人都可以提供伪代码或解释这是怎么可能的吗?这里还有一个问题:How to determine whether a binary tree is complete?

这个答案中有一个伪代码,但我不明白所有随机变量来自哪里,或者它们要代表什么,或者为什么最后 3 行的括号中有两个值。如果有人可以提供其他代表的帮助,我将不胜感激。

【问题讨论】:

    标签: java binary-tree


    【解决方案1】:
    int CT()
    {
      int lh=0, rh=0, sign=1;
      if (!root->left && !root->right) 
        return 1;
      if (!root->left && root->right) 
        return 0;
    
      lh = CT(root->left);
      rh = CT(root->right);
    
      if (lh == 0 || rh == 0) 
        return 0;
      if (lh < 0 && rh < 0) 
        return 0;
      if (lh < 0 || rh < 0) 
        sign = -1;
      if (|lh| == |rh| ) 
        return (|lh|+1)*sign;
      elseif (rh == lh-1) 
        return -(|lh|+1);
      else return 0;
    }
    
    if CT returns '0' - its not a complete tree.
    '-' is used to check mismatch in height is encountered on one subtree only.
    

    【讨论】:

    • 高级但有趣 :-) 如果他将其用于家庭作业,那么他将失败。您的代码具有一定程度的复杂性。
    【解决方案2】:

    从左到右遍历树。您需要在几个关键点存储或比较信息:

    • 点击第一个叶节点时。
    • 点击后续叶节点时。
    • 当您点击距根不同距离的第一个叶节点时。

    由于这是家庭作业,您可能应该按照提示完成剩下的工作。

    【讨论】:

    • 所以我会按顺序遍历树并找到带有if (tree.left == null &amp;&amp; tree.right == null) 的第一个叶节点,在这种情况下,我会将当前深度存储到一个全局变量中,然后以某种方式将其与下一个叶节点进行比较如果它们相等,则返回 true。如果它们不同,我会将较大的值存储在 maxValue 并将较小的值存储在 minValue。那么如果 maxValue 和 minValue 到最后只相差 1 或 0,那是完整的二叉树吗?这就是我能想到的一切......
    • 你在正确的轨道上。但是,您必须保证最后一行是从左到右填充的。那么在具有不同深度的最左边之后的第一个叶子节点必须发生什么?在该步骤之后的叶节点上不能发生什么?
    • 另外,比全局变量更好的方法是在遍历中携带数据。例如,您可以将相同的对象传递给每个节点的访问,并在该对象中记录观察结果。可选地,这个对象还可以包含应该在每个节点上执行的行为——这被称为访问者模式。
    • 通宵达旦,脑筋急转直下。明天起床后我会试试这个并报告。感谢您的回复。
    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2015-04-23
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多