【问题标题】:Binary Tree - Complete二叉树 - 完成
【发布时间】:2014-11-26 00:55:08
【问题描述】:

我目前正在学习 BST 并编写不同的功能,例如插入搜索。我遇到了一个有趣的编程面试问题,它要求编写一个函数来检查 bst 是否完整。

所以我的理解是,如果所有叶子都在同一级别终止,则 BST 是完整的。

我对这个解决方案的可能的方法

我认为如果左右节点下的叶子终止于同一级别,则左右节点的高度应该相同。所以我可以做一个简单的检查,看看右子树的高度是否与左子树的高度相同,如果是,那么这应该向我表明 BST 树是完整的。谁能确认我的方法是否正确或建议其他可能的方法?我不是在寻找代码,只是想了解我的理解和方法。

【问题讨论】:

  • 节点数 = 2^n - 1

标签: c binary-search-tree


【解决方案1】:

您的递归方法几乎是正确的。您想对给定节点提出以下问题:

  • 左孩子是完整 BST 的根吗?如果是,它的高度是多少?
  • 右孩子是完整 BST 的根吗?如果是,它的高度是否与左孩子的高度相同?

如果两者的答案都是肯定的,那么你就有了完整的 BST。

解决此问题的另一种方法是回答以下关于树的三个问题。

  • 是 BST 吗?
  • 其中有多少个节点?
  • 它的高度是多少?

如果树是高度为h2**h - 1 节点的BST,则您有一个完整的BST。这三个问题中的每一个都可以通过递归树遍历来回答。

【讨论】:

    【解决方案2】:

    您的方法行不通,因为树可能左右相等,并且所有叶子都不相同,例如:

          5
          /\
         3  6
        /   \
       1     7
    

    这棵树的左右相等,但 6 没有左孩子,3 没有右孩子。 完整树的定义是 完全二叉树是一种二叉树,其中除了可能的最后一层,每一层都被完全填满,and all nodes are as far left as possible

    节点数 = 2^n-1 也无法解决它,因为它可能包含该数字但不平衡。

    正确的做法是

    • 使用类似后序遍历的方式遍历树,当你到达第一片叶子时,你设置max_depth
    • 在遍历过程中,如果到达叶节点,它必须在max_depth,否则深度可以减少到max_depth -1,但之后深度不能再增加。

    那就是处理这样的情况(这是一个完整的BST树)

          4
          /\
         2  6
        / \  /\
       1   3 5 
    

    【讨论】:

      【解决方案3】:

      我认为你的基本想法是正确的。您只需递归检查左树是否与右树高度相同。

      代码看起来像

      int isComplete(Tree *t){
          if(t->left==NULL && t->right==NULL)
              return 0;
          else if(t->left!=NULL && t->right != NULL){   
              int leftheight = isComplete(t->left);
              int rightheight = isComplete(t->right);
              if(leftheight == rightheight && leftheight != -1)
                  return leftheight+1;
          }
          return -1;
      }
      

      -1 表示不完整。非负返回表示树的高度。

      【讨论】:

        猜你喜欢
        • 2019-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-23
        • 2019-03-09
        • 2020-08-24
        相关资源
        最近更新 更多