本文參考自《劍指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.注意判斷浮點數相等時有誤差,不要直接用“==”判斷。