[英]Binary Tree - Complete
我目前正在學習有關BST的信息,並正在編寫不同的功能,例如插入搜索。 我遇到了一個有趣的編程面試問題,它要求編寫一個函數來檢查bst是否完成。
因此,我的理解是,如果所有葉子都在同一級別終止,則BST是完整的。
我可能的解決方案
我認為,如果左右節點的葉子在同一水平處終止,則它們的高度應該相同。 所以我可以做一個簡單的檢查,看看右子樹的高度是否和左子樹的高度相同,如果是,那應該向我表明BST樹已完成。 誰能確認我的方法是否正確或建議其他可能的方法? 我不是在尋找代碼,只是想根據我的理解和方法進行工作。
您的遞歸方法幾乎是正確的。 您想對給定節點提出以下問題:
如果兩個答案都是肯定的,則您具有完整的BST。
解決此問題的另一種方法是回答關於樹的以下三個問題。
如果樹是高度為h
且具有2**h - 1
節點的BST,則您具有完整的BST。 這三個問題中的每一個都可以通過遞歸樹遍歷來回答。
您的方法行不通,因為樹的左右兩邊可能相等,而所有葉子都不相同,例如:
5
/\
3 6
/ \
1 7
這棵樹的左右兩邊相等,但是6個沒有左子,而3個沒有右子。 完整樹的定義為:完整二叉樹是一個二叉樹,其中每個級別(可能除了最后一個級別)都被完全填充, and all nodes are as far left as possible
節點數= 2 ^ n-1也無法解決,因為它可能包含該數目但不平衡。
正確的做法是
max_depth
max_depth
否則depth可以減小為max_depth -1
但之后深度不能再增加。 就是要處理這樣的情況(這是完整的BST樹)
4
/\
2 6
/ \ /\
1 3 5
我認為您的基本想法是正確的。 您只需遞歸檢查左樹是否與右樹相同的高度。
代碼看起來像
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表示未完成。 非負返回值表示樹的高度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.