劍指offer(十七)——樹的子結構
題目描述
輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
題解
首先理解題意,B是A的子結構的前提是,B樹是A樹的一部分,即從B的根節點開始,要與A其中一個結點開始,結點值完全一致。
- 因爲已經說了,空樹不是子結構,所以先行判定兩樹是否爲空。
- 然後我們需要在A樹中找到與B樹根節點對應的節點,從那裏開始進行判定,因此我們創建了一個函數IsSubtree(TreeNode,TreeNode)用來判定所有節點是否相符。
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if (root1 == null || root2 == null) {
return false;
}
//從該節點開始判定是否相符
//從A樹的左孩子開始判定是否相符
//從A樹的右孩子開始判定是否相符
return IsSubtree(root1, root2) || HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);
}
public boolean IsSubtree(TreeNode root1, TreeNode root2) {
//當B樹遍歷完之後,即B樹爲A樹子結構,返回true
if (root2 == null) {
return true;
}
//當A樹遍歷完,但是B樹沒有,證明不是子結構,返回false
if (root1 == null) {
return false;
}
//當該節點一致時,同時向其孩子搜索判定
if (root1.val == root2.val) {
return IsSubtree(root1.left, root2.left) && IsSubtree(root1.right, root2.right);
}else {
return false;
}
}