簡體   English   中英

二叉樹-完成

[英]Binary Tree - Complete

我目前正在學習有關BST的信息,並正在編寫不同的功能,例如插入搜索。 我遇到了一個有趣的編程面試問題,它要求編寫一個函數來檢查bst是否完成。

因此,我的理解是,如果所有葉子都在同一級別終止,則BST是完整的。

可能的解決方案

我認為,如果左右節點的葉子在同一水平處終止,則它們的高度應該相同。 所以我可以做一個簡單的檢查,看看右子樹的高度是否和左子樹的高度相同,如果是,那應該向我表明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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM