簡體   English   中英

在遞歸調用方法的情況下返回

[英]Return in case of Recursive call to a method

我有一段代碼需要深入了解,我不想知道該問題的正確解決方案。 我只想知道為什么我的概念失敗了。 所以功能是檢查二叉樹是否是BST。 如果需要返回1,否則返回0。 我的代碼如下

int isBST(Node root) {
 if(root == null)
  return 1;
 if(root.left!=null) {
  if(root.left.data<root.data)
    isBST(root.left);
  else
   return 0; // line:a
 }
 if(root.right!=null) {
  if(root.right.data<root.data)
    isBST(root.right);
  else
   return 0;
 }
return 1;
}

對於這一部分,當我有如下的二叉樹時:

5
 \
  7
 /
8

我希望它達到8的值並在line:a處中斷,但是它返回1而不是0。現在我知道0返回到父調用方法。 但這不是因為我進行了isBST調用而沒有捕獲返回值而終止嗎? 請不要指出是否還有其他錯誤。

對於一般情況,您的方法行不通。 測試樹是否為BST的方法是遞歸檢查當前節點是否大於左側子樹的最大元素,並且小於右側子樹的最小元素。 另外,您在遞歸調用中缺少返回值:

return isBST(root.left);
...
return isBST(root.right);

順便說一句,為什么要為此返回01 請使用falsetrue ,將返回類型更改為boolean

您應該檢查正確的數據是否大於當前數據,並返回遞歸調用的值

if(root.right.data>root.data)

我看到以下問題:

  • 如果(且僅) isBST(root.left)isBST(root.right)為false,則需要立即返回0(順便說一句,為什么不使用布爾值?)。
  • 條件root.right.data<root.data應該被反轉: root.right.data>=root.data

因此,這是修改后的代碼(保留int返回類型):

int isBST(Node root) {
 if(root == null)
  return 1;
 if(root.left!=null) {
  if(root.left.data<root.data) {
    if (isBST(root.left) == 0)
      return 0;
  } else
   return 0;
 }
 if(root.right!=null) {
  if(root.right.data>=root.data) {
    if (isBST(root.right) == 0) {
      return 0;
    }
  } else
   return 0;
 }
return 1;
}

暫無
暫無

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

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