劍指Offer(Java版):樹的子結構

二叉樹的結構定義爲:java

 

[java] view plain copynode

 

  1. package utils;  
  2.   
  3. public class BinaryTreeNode {  
  4.     public int value;  
  5.     public BinaryTreeNode leftNode;  
  6.     public BinaryTreeNode rightNode;  
  7.       
  8.     public BinaryTreeNode(){  
  9.           
  10.     }  
  11.     public BinaryTreeNode(int value){  
  12.         this.value = value ;  
  13.         this.leftNode = null;  
  14.         this.rightNode = null;  
  15.     }  
  16.       
  17. }  

 

或者面試

class BinaryTreeNode{  
    int data;  
    BinaryTreeNode leftNode;  
    BinaryTreeNode rightNode;  
     
}app

題目:輸入兩棵二叉樹A和B,判斷B是否是A的子結構。this

例如圖中所示的兩棵二叉樹,因爲A中有一部分子樹的結構和B 是同樣的,所以B是A的子結構。spa

要查找樹A中是否存在和樹B結構同樣的子樹,咱們能夠分兩步:第一步在樹A中找到和B的根節點的值同樣的結點R,第二步再判斷樹A中以R爲根結點的子樹是否是包含和樹B同樣的結構。.net

以上面的兩棵樹爲例來詳細分析這個過程。首先咱們試着在樹A中找到值 爲8的結點。從樹A的根節點開始遍歷,咱們發現它的根節點的值就是8.接着咱們就去判斷樹A的根節點下面的子樹是否是含有和樹B同樣的結構。在樹A中,根 節點的左子結點的值是8,而樹B的根節點的左子結點是9,對應的兩個結點不一樣。指針

所以咱們仍然要遍歷A,接着查找值爲8的結點。咱們在樹的第二層中找 到一個值爲8 的結點,而後進行第二步的判斷,即判斷這個結點下面的子樹是否含有和樹B同樣結構的子樹。因而咱們遍歷這個結點下面的子樹,前後獲得兩個子節點9和2,這 和樹B的結構徹底相同。此時咱們在樹A中找到了一個和樹B的結構同樣的子樹,所以樹B和樹A的子結構。blog

在面試的時候,咱們必定要檢查邊界條件,即檢查空指針。當樹A或樹B爲空的時候,定義相同的輸出。若是沒有檢查並作響應的處理,程序很是容易崩潰,這是面試的時候很是忌諱的事情。ip

下面咱們用Java代碼來實現:

package cglib;
class BinaryTreeNode{  
    int data;  
    BinaryTreeNode leftNode;  
    BinaryTreeNode rightNode;  
     
}  

public class DeleteNode {     public static void main(String args[])     {     BinaryTreeNode root1=new BinaryTreeNode();     BinaryTreeNode node1=new BinaryTreeNode();     BinaryTreeNode node2=new BinaryTreeNode();     BinaryTreeNode node3=new BinaryTreeNode();     BinaryTreeNode node4=new BinaryTreeNode();     BinaryTreeNode node5=new BinaryTreeNode();     BinaryTreeNode node6=new BinaryTreeNode();     root1.leftNode=node1;     root1.rightNode=node2;     node1.leftNode=node3;     node1.rightNode=node4;     node4.leftNode=node5;     node4.rightNode=node6;     root1.data=8;     node1.data=8;     node2.data=7;     node3.data=9;     node4.data=2;     node5.data=4;     node6.data=7;     BinaryTreeNode root2=new BinaryTreeNode();     BinaryTreeNode a=new BinaryTreeNode();     BinaryTreeNode b=new BinaryTreeNode();     root2.leftNode=a;     root2.rightNode=b;     root2.data=8;     a.data=9;     b.data=2;     DeleteNode test=new DeleteNode();     System.out.println(test.hasSubTree(root1, root2));     }      public boolean hasSubTree(BinaryTreeNode root1,BinaryTreeNode root2){          boolean result=false;    if(root1!=null&&root2!=null){     if(root1.data==root2.data){//8,8         result=doesTree1HavaTree2(root1,root2);         if(!result)         result=hasSubTree(root1.leftNode, root2);//看左結點8是否是等於頭結點8         if(!result)         result=hasSubTree(root1.rightNode, root2);         }         }         return result;//8,9不等         }         private boolean doesTree1HavaTree2(BinaryTreeNode root1, BinaryTreeNode root2) {         if(root2==null){         return true;         }         else if(root1==null)             return false;         if(root1.data!=root2.data){         return false;         }         return doesTree1HavaTree2(root1.leftNode, root2.leftNode)&&         doesTree1HavaTree2(root1.rightNode, root2.rightNode);//頭結點相等,繼續看左右兩結點是否是相等         } }

相關文章
相關標籤/搜索