題目描述
輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
第一步:在樹A中查找與根節點相等的節點,可以用遞歸。
第二步:判斷A中以某個根節點的子樹是否和樹B具有相同的子樹,同樣可以用遞歸實現。
注意空指針的處理。
/**
* @author yuan
* @date 2019/2/13
* @description
*/
public class 樹的子結構 {
static class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean result = false;
if (root1 != null && root2 != null) {
// 比較兩個根節點
if (root1.val == root2.val) {
// 如果根節點相等, 繼續比較子樹
result = tree1HaveTree2(root1, root2);
}
if (!result) {
// 如果不是子樹,繼續比較
result = HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);
}
}
return result;
}
private boolean tree1HaveTree2(TreeNode root1, TreeNode root2) {
if (root2 == null) {
return true;
}
if (root1 == null) {
return false;
}
if (root1.val != root2.val) {
return false;
}
// 如果兩個根節點相等,繼續比較左右節點
return tree1HaveTree2(root1.left, root2.left) && tree1HaveTree2(root1.right, root2.right);
}
}