我目前正在学习BST并编写插入搜索等不同功能。我遇到了一个有趣的编程面试问题,它要求编写一个函数来检查bst是否完整。
所以我的理解是,如果所有叶子终止于同一水平,则BST完成。
此解决方案的可能方法
我认为如果它们下面的叶子终止于同一水平,左右节点的高度应该相同。所以我可以做一个简单的检查,看看右子树的高度是否与左子树相同,如果是,那么应该告诉我BST树是完整的。任何人都可以确认我的方法是否正确或建议其他可能的方法?我不是在寻找代码,只是想了解我的理解和方法。
答案 0 :(得分:2)
您的递归方法几乎是正确的。您想要询问的给定节点是以下问题:
如果两者的答案都是肯定的,那么您就拥有完整的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表示不完整。非负返回表示树的高度。