二叉樹的結構定義爲:java
[java] view plain copynode
或者面試
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);//頭結點相等,繼續看左右兩結點是否是相等 } }