題目描述
輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
分析
查找A中是否存在樹B結構一樣的子樹,可以分為兩步:
第一步,在樹A中找到和樹B的根節點的值一樣的節點R
第二步,判斷A中以R為根節點的子樹是不是包含和樹B一樣的結構
以上面為例,先在A中找到值為8的節點,接着判斷樹A的根節點下面的子樹是不是含有和樹B一樣的結構。在A中根節點的左子節點為8,而樹B的根節點的左子節點為9,對應兩個節點不同。
接着找8的節點,在A中第二層找到,然后進行第二步的判斷(判斷這個節點下面的子樹是否含有樹B一樣的結構)
代碼
第一步
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean result = false;
//當root1和root2都不為null的時候,才進行比較。否則直接返回false
if(root1 != null && root2 != null) {
//如果找到了對應root2的根節點的點
if(root1.val == root2.val) {
//以這個根節點為為起點判斷是否包含root2
result = DoesTreeHaveTree2(root1, root2);
}
if(!result) {
//如果找不到,那么就再去root1的左兒子當作起點,去判斷時候包含root2
result = HasSubtree(root1.left, root2);
}
if(!result) {
//如果還找不到,那么就再去root1的右兒子當作起點,去判斷時候包含root2
result = HasSubtree(root1.right, root2);
}
}
return result;
}
第二步
public boolean DoesTreeHaveTree2(TreeNode node1, TreeNode node2) {
//如果node2已經遍歷完了都能對應的上,返回true
if(node2 == null) {
return true;
}
//如果node2還沒有遍歷完,node1卻遍歷完了。返回false
if(node1 == null) {
return false;
}
//如果其中有一個點沒有對應上,返回false
if(node1.val != node2.val) {
return false;
}
//如果根節點對應的上,那么就分別去子節點里面匹配
return DoesTreeHaveTree2(node1.left, node2.left) && DoesTreeHaveTree2(node1.right, node2.right);
}