本文參考自《劍指offer》一書,代碼採用Java語言。html
更多:《劍指Offer》Java實現合集 java
輸入兩棵二叉樹A和B,判斷B是否是A的子結構。post
1)先對A樹進行遍歷,找到與B樹的根結點值相同的結點R;測試
2)判斷A樹中以R爲根結點的子樹是否包含B樹同樣的結構。
this
測試算例 url
1.功能測試(A、B爲普通二叉樹;B是或者不是A樹的子結構)spa
2.特殊測試(任意一個或者兩個樹的根結點爲null;左斜樹;右斜樹)htm
//題目:輸入兩棵二叉樹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的處理。blog
2.注意判斷浮點數相等時有偏差,不要直接用「==」判斷。get