二叉树 - 完整

时间:2014-11-26 00:55:09

标签: c binary-search-tree

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

所以我的理解是,如果所有叶子终止于同一水平,则BST完成。

此解决方案的可能方法

我认为如果它们下面的叶子终止于同一水平,左右节点的高度应该相同。所以我可以做一个简单的检查,看看右子树的高度是否与左子树相同,如果是,那么应该告诉我BST树是完整的。任何人都可以确认我的方法是否正确或建议其他可能的方法?我不是在寻找代码,只是想了解我的理解和方法。

3 个答案:

答案 0 :(得分:2)

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

  • 左边的孩子是完整BST的根,如果是,它的高度是多少?
  • 正确的孩子是完整BST的根,如果是,它的身高是否与左孩子的身高相同?

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

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

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

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

答案 1 :(得分:1)

你的方法不起作用,因为左边和右边的树可能相同而且所有叶子都不一样,如:

      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 

答案 2 :(得分:1)

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

代码看起来像

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表示不完整。非负返回表示树的高度。