2017-05-08 72 views
1

在遍历方法中遇到了一些麻烦我的代码应该按顺序遍历给定的树,并且如果它正确地返回true。我通过遍历它并将元素添加到arrayList来完成此操作。我有一个方法isSorted返回1,如果数组列表排序(这是每次我添加一个数组列表元素)和0,如果不是。为了遍历错误?

它执行返回相关性1或0对应于它是否被排序的工作,但它不会在此之后停止执行。因为如果没有进行排序比可以安全地说遍历没有正确完成,但它说明是正确的。谁能帮忙?

public ArrayList<Integer> inOrderCheck = new ArrayList<Integer>(); 


boolean checkBST(Node root) { 

    if(root != null){ 
     checkBST(root.left); 
     if(addToList(root.data) == 0){ 
      return false; 
     } 

     checkBST(root.right); 

    } 


    return true; 

    // Integer[] inOrderArray = inOrderCheck.toArray(new Integer[inOrderCheck.size()]); 




} 

int addToList(int data){ 

    //System.out.println("Initial size of inOrderCheck: " + inOrderCheck.size()); 
if(!(inOrderCheck.contains(data))){ 
    // System.out.println("Adding: " + data); 
     inOrderCheck.add(data); 
} 

//System.out.println(" size of inOrderCheck after adddition: " + inOrderCheck.size()); 
    // System.out.println("Contents of inOrderCheck: " + inOrderCheck); 

    // System.out.println("Result of isSorted: " + isSorted()); 

return isSorted();  
} 



int isSorted(){ 

int sorted = 0;   
for (int i = 1; i < inOrderCheck.size(); i++) { 
    //System.out.println("Result of isSorted: " + inOrderCheck.get(i-1) + " "+ inOrderCheck.get(i)); 
    if (inOrderCheck.get(i-1) < (inOrderCheck.get(i))) { 
     sorted = 1; 
    }else 
     sorted = 0; 
} 

return sorted; 
} 
+0

也许你不应该忽视的布尔从递归调用'checkBST'返回。 – Eran

+0

@Eran像什么设置它们等于一个布尔? – SJackson193

+0

@ SJackson193如果'checkBST(root.left)'返回false,则应该返回false。 'checkBST(root.right)'相同。 – Eran

回答

3

您忽略了递归调用返回的值。如果左侧或右侧子树的任何一个调用返回false,则应返回false。

boolean checkBST(Node root) { 
    if (root != null) { 
     if (!checkBST(root.left)) 
      return false; 
     if (!addToList(root.data)) 
      return false; 
     if (!checkBST(root.right)) 
      return false; 
    } 
    return true; 
} 

此外,您的isSorted方法有一些问题。 首先,它应该返回布尔值。其次,当列表只包含一个元素时,它不应该返回0

我将其更改为:

boolean isSorted() {  
    for (int i = 1; i < inOrderCheck.size(); i++) { 
     if (inOrderCheck.get(i-1) >= inOrderCheck.get(i)) { 
      return false; 
     } 
    } 
    return true; 
} 

boolean addToList(int data) { 
    if(!inOrderCheck.contains(data)) { 
     inOrderCheck.add(data); 
    } else { 
     return false; 
    } 
    return isSorted(); 
} 
+0

我做到了这一点,现在它有一个问题添加的东西 – SJackson193

+0

像让我们说它去叶节点。它只是在那里停下来,永远不会检查根目录 – SJackson193

+0

@ SJackson193如果最后一个添加的元素导致列表变得不被排序,这意味着该树不是BST,它将停止向列表添加元素。 – Eran