2015-03-24 89 views
0

import java.util。*;我想找到一棵樹是否是另一棵樹的子樹,並運行到ArrayList比較prolem

class TreeDemo 
{ 

public static class Node 
{ 
    int val; 
    Node right, left; 

    Node(int val) 
    { 
     this.val = val; 
    } 
} 

public static class Tree{ 
    ArrayList<Node> list = new ArrayList<>(); 
    Node root; 

    void insert(int val) 
    { 
     if (root == null) 
     { 
      root = new Node(val) ; 
     } 
     else{ 
      insertNode(val,root); 
     } 
    } 

    void insertNode(int val, Node root) 
    { 
     if (root == null) 
     { 
      root = new Node(val) ; 
     } 
     if (val < root.val) 
     { 
      if(root.left == null) 
      { 
       root.left = new Node(val) ; 
      } 
      else 
      { 
       insertNode(val, root.left); 
      } 
     } 

     else if (val > root.val) 
     { 
      if(root.right == null) 
      { 
       root.right = new Node(val) ; 
      } 
      else 
      { 
       insertNode(val, root.right); 
      } 
     } 


    } 



    ArrayList<Node> preOrder(Node root) 
    { 

     if(root!=null) 
     { 
      System.out.println(root.val); 
      list.add(root); 
     } 
     if(root.left!=null) 
     { 

      preOrder(root.left); 

     } 
     if(root.right!=null) 
     { 

      preOrder(root.right); 

     } 
     return list; 
    } 
} 

public static void main(String[] args) 
{ 


    Tree t= new Tree(); 

    t.insert(5); 
    t.insert(3); 
    t.insert(7); 
    t.insert(2); 
    t.insert(4); 
    t.insert(1); 
    t.insert(7); 
    t.insert(9); 
    t.insert(6); 



    Tree r = new Tree(); 
    r.insert(3); 
    r.insert(2); 
    r.insert(4); 
    r.insert(1); 

     List<Node> a = t.preOrder(t.root); 
     System.out.println("----------------------------------------------------"); 
     List<Node> b = r.preOrder(r.root); 

     if (a.containsAll(b)) 

這條線似乎不適合我或我相信我可能犯了一些我不能注意到的錯誤。

 { 
      System.out.println("contains"); 
     } 
     else 
     { 
      System.out.println("does not contain"); 
     } 

} 
} 

這只是一個簡單的樹實現中,我將所有的節點,因爲他們遇到到一個列表,然後檢查是否較小的字符串,因爲這將使我們更小的樹將一個子大串是更大的樹 感謝大家對他們的幫助的子樹...

+0

什麼不工作?例外?錯誤的輸出?如果是這樣,它是什麼,預期產出是多少? – 2015-03-24 21:39:13

+0

所以列表b包含在列表a中,但ContainsAll給我一個假... m不知道我在哪裏犯錯... – Mudit 2015-03-24 21:41:16

回答

2

containsAll()ArrayList實現使用類型的equals()方法來確定一個列表包含了其他的元素。

您尚未爲您的Node課程覆蓋equals(),因此它將使用從Object開始的實施,該實施將檢查參考平等。此檢查將失敗,因爲您在insert()方法中創建了新的Node

您需要覆蓋equals()並使其檢查包含在Node中的值是否相等。

+0

好點!但沒有運氣我改變了ArrayList list = new ArrayList <>(); ArrayList list = new ArrayList <>(); and list.add(root.val);但仍然是假的 – Mudit 2015-03-24 21:48:14

+0

嗯,我不確定你做了什麼改變,但'Integer'列表中的'containsAll()'應該可以正常工作。例如,'List list1 = Arrays.asList(new Integer [] {1,2,3}); List list2 = Arrays.asList(new Integer [] {1,2}); System.out.println(list1.containsAll(list2));'給出值'true'。 – azurefrog 2015-03-24 21:58:24

+0

無論如何,正確的解決方法是在任何想要檢查相等性的類上實現equals()。 – azurefrog 2015-03-24 21:59:24