題目node
輸入兩棵二叉樹 A 和 B,判斷 B 是否是 A 的子結構。面試
以下給你兩棵樹:ide
問題分析測試
咱們要判斷一個二叉樹是否爲另外一個二叉樹的子結構,如圖,判斷二叉樹 B 是否爲二叉樹 A 的子結構,就須要從二叉樹的 A 的根節點和二叉樹 B 的根節點起開始判斷。動畫
若是兩個二叉樹的根節點相同的時候,咱們就分別遞歸判斷剩餘的結點是否相同,若是相同,則 B 爲 A 的子結構,不然,咱們就判斷其餘的 A 的子結構是否和 B 的結構相同。code
既然問題咱們已經分析清楚了,咱們開始手寫代碼。blog
動畫實現遞歸
代碼拆解ip
第一步,判斷傳入的兩棵樹是否爲空,若是 A 樹爲空,則返回null。若是 B 樹爲空,則是 A 樹的子結構返回 true。it
1// 匹配的返回值 2const result = false; 3 4// 判斷兩棵樹是否爲空 5if(NodeA == null || NodeB == null){ 6 return null; 7}
第二步,若是兩棵樹不爲空,則判斷兩棵樹的根節點是否相同。
1// 根節點相等就進行匹配 2if(NodeA.data == NodeB.data){ 3 result = match(NodeA,NodeB); 4}
第三步,若是兩棵樹的根節點相同,則進行匹配。匹配過程是一個遞歸的過程。
1// 開始匹配 2const match = (NodeA,NodeB)=>{ 3 // 終止條件 4 if(nodeB == null){ 5 return true; 6 } 7 if(nodeA == null){ 8 return false; 9 } 10 // 若是匹配的當前結點相等,繼續匹配下面的結點 11 if(nodeA.data == nodeB.data){ 12 return match(NodeA.left,NodeB.left) && match(NodeA.right,NodeB.right); 13 }else{ 14 return false; 15 } 16}
第四步,若是兩棵樹根節點不相同,則也對其他節點進行遞歸遍歷,找其餘樹節點是否存在根節點相同的節點。
1 // 判斷上述過程是否匹配成功 2 if(result){ 3 return true; 4 } 5 // 繼續匹配其餘節點 6 return matchTree(NodeA.left,NodeB) || matchTree(NodeA.right,NodeB)
代碼實現
JavaScript 版本
Java 版本
Python 版本
測試用例