動畫:面試必刷之二叉樹的子結構

動畫:面試必刷之二叉樹的子結構

題目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 版本

動畫:面試必刷之二叉樹的子結構
測試用例

  • 是子結構、不是子結構 —— 普通測試。
  • 只有左子節點、只有右子節點、只有一個結點 —— 特殊測試。
  • 空樹 —— 輸入測試。
相關文章
相關標籤/搜索