剑指Offer第十题:树的子结构
问题描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)。
问题分析
判断B是不是A的子树,除了不考虑空树之外,我们需要将B的根节点在A中寻找和他相等的节点,找到相应节点后,再依次比较剩下的节点。一般树的操作都用的递归,比较简单,但是理解上比较难理解,不过多兰几遍就明白了。
算法分析
- 题目已经说明空树不是任意的树的子结构,那么空树不能考虑做子树。
- 在整个算法下的要求就是两棵树都不能为空。
- 首先我们得遍历A树寻找到和B树根节点相等的值(这是一个函数).
- 然后找到相应的节点后,我们需要封装一个函数来判断是不是子树。
Ps:递归调用主要是参数的控制。
源代码
1 class TreeNode { 2 int val; 3 TreeNode left; 4 TreeNode right; 5 6 TreeNode(int x) { 7 val = x; 8 } 9 } 10 11 12 13 public boolean HasSubtree(TreeNode root1,TreeNode root2) { 14 boolean isSubtree=false;//定义一个标记符作为最后的结果返回 15 if(root1!=null&&root2!=null) {//由题目要求,子树存在的条件是,两棵树都不为空 16 if(root1.val==root2.val) {//判断节点是否找到。 17 isSubtree=isTree(root1,root2);//判断是不是子树 18 } 19 if(!isSubtree) {//如果还没有找到,那么先从左子树遍历,HasSubtree函数的A树就root1.left操作 20 isSubtree=HasSubtree(root1.left, root2); 21 } 22 if(!isSubtree) {//如果还没有找到,那么先从左子树遍历,HasSubtree函数的A树就root1.right操作 23 isSubtree=HasSubtree(root1.right, root2); 24 } 25 } 26 27 return isSubtree; 28 } 29 30 public boolean isTree(TreeNode r1,TreeNode r2) { 31 if(r2==null)//如果r2为空,那么r2是r1的子树 32 return true; 33 if(r1==null)//反之不是 34 return false; 35 if(r1.val!=r2.val)//如果其中的一个节点不一样,那么表示不是子树。 36 return false; 37 return isTree(r1.left, r2.left)&&isTree(r1.right, r2.right);//依次遍历递归,知道找到为止 38 }