簡體   English   中英

為什么我不能在一條語句中獲得 BST 的高度 (Java)

[英]Why can't I get the height of a BST in one statement (Java)

我正在學習二叉搜索樹,並且有一個練習題涉及遞歸查找樹的高度。

這是被接受的 Java 代碼:

public static int getHeight(Node root){
        if (root == null)
            return -1;
        else {
            int leftHeight = getHeight(root.left);
            int rightHeight = getHeight(root.right);

            if (leftHeight > rightHeight)
                return leftHeight + 1;
            else
                return rightHeight + 1;
        }
}   

這是我最初嘗試並認為可行的代碼(在教程中作為偽代碼給出):

public static int getHeight(Node root){
     return 1 + Math.max(getHeight(root.left), getHeight(root.right));
}   

但是,當我去提交第二個語句時,它給了我一個運行時錯誤和 NPE。 if (root == null){return -1}; 第二條語句不隱含的基本情況?

是的,當root是 null 時, root.left被調用,這就是你得到 NPE 的原因。

並且遞歸 function 需要一個基本案例,它不會再次調用遞歸 function。 在這里,當rootnull時,這意味着您在root.leftroot.right上調用getHeight() ,其中root是樹的葉子,這是基本情況。

@Eklavya 在這里有正確的答案,但是由於您正在學習並且我喜歡遞歸,因此可以添加一些好的經驗法則。

  • 在你的代碼中總是有一個明確的終止條件。 隱式終止可能很聰明,但傳達和維護它卻很困難
  • 在 Java 中,始終假定您的方法中的值為 null,除非您另外特別注釋了它。 未受保護的兒童訪問始終是一種代碼味道
  • 大多數具有顯式隱私的語言(如 Java)的最佳實踐不是直接使用成員,而是構建接口並從接口引用方法( root.left()而不是root.left )。 現在有點痛苦,但如果你堅持下去,它會為你節省數千小時的浪費時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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