1.题目
输入两棵二叉树A和B,判断B是不是A的子结构。
2.分析
1)先对A树进行遍历,找到与B树的根结点值相同的结点R;
2)判断A树中以R为根结点的子树是否包含B树一样的结构。
3.测试用例
1.功能测试(A、B为普通二叉树;B是或者不是A树的子结构)
2.特殊测试(任意一个或者两个树的根结点为null;左斜树;右斜树)
4.程序
1 package first; 2 3 public class SubstructureInTree { 4 /* 5 * 主程序,对每个结点遍历判断 6 */ 7 public boolean hasSubtree(TreeNode root1,TreeNode root2) { 8 if(root1==null || root2==null) 9 return false; 10 //上面几行可以直接写成: 11 return doesTree1HasTree2(root1, root2)|| hasSubtree(root1.left, root2) 12 ||hasSubtree(root1.right, root2); 13 } 14 15 /* 16 * 判断root结点开始的子树中各个结点是否相同 17 */ 18 private boolean doesTree1HasTree2(TreeNode root1,TreeNode root2) { 19 if(root2==null) return true; 20 if(root1==null) return false; 21 return equal(root1.val, root2.val) && doesTree1HasTree2(root1.left, root2.left) && doesTree1HasTree2(root1.right, root2.right); 22 } 23 24 /* 25 * 判断两个浮点数是否相等 26 */ 27 private boolean equal(double num1,double num2) { 28 if(num1-num2<0.0000001 && num1-num2>-0.0000001 ) 29 return true; 30 return false; 31 } 32 }