本文參考自《劍指offer》一書,代碼采用Java語言。
題目
輸入兩棵二叉樹A和B,判斷B是不是A的子結構。
思路
1)先對A樹進行遍歷,找到與B樹的根結點值相同的結點R;
2)判斷A樹中以R為根結點的子樹是否包含B樹一樣的結構。
測試算例
1.功能測試(A、B為普通二叉樹;B是或者不是A樹的子結構)
2.特殊測試(任意一個或者兩個樹的根結點為null;左斜樹;右斜樹)
Java代碼
//題目:輸入兩棵二叉樹A和B,判斷B是不是A的子結構。
public class SubstructureInTree {
public class TreeNode{
double val;
TreeNode left = null;
TreeNode right =null;
public TreeNode(int val) {
this.val=val;
}
}
/*
* 主程序,對每個結點遍歷判斷
*/
public boolean hasSubtree(TreeNode root1,TreeNode root2) {
if(root1==null || root2==null)
return false;
// boolean result=false;
// if(equal(root1.val, root2.val)) {
// result = doesTree1HasTree2(root1, root2);
// if(!result)
// result=hasSubtree(root1.left, root2)
// ||hasSubtree(root1.right, root2);
// }
// return result;
//上面幾行可以直接寫成:
return doesTree1HasTree2(root1, root2)|| hasSubtree(root1.left, root2)
||hasSubtree(root1.right, root2);
}
/*
* 判斷root結點開始的子樹中各個結點是否相同
*/
private boolean doesTree1HasTree2(TreeNode root1,TreeNode root2) {
if(root2==null) return true;
if(root1==null) return false;
return equal(root1.val, root2.val) && doesTree1HasTree2(root1.left, root2.left)
&& doesTree1HasTree2(root1.right, root2.right);
}
/*
* 判斷兩個浮點數是否相等
*/
private boolean equal(double num1,double num2) {
if(num1-num2<0.0000001 && num1-num2>-0.0000001 )
return true;
return false;
}
}
收獲
1.本題相當於對二叉樹遍歷的拓展,操作過程中,注意null的處理。
2.注意判斷浮點數相等時有誤差,不要直接用“==”判斷。
