声明:本题是剑指offer中的一道题目,但是看了何海涛的日志,我的思路和他的思路有些不同。这里写下我自己思路和代码。
题目:二叉树的结点定义如下。
思路:判断root2是不是root1的子树,首先判断从root1开始的最上面的子树和root2是不是相同,如果相同,则返回true,如果不相同就判断root1.left和root1.right对应的子树是不是包含root2。
所以代码分两个函数,一个函数是hasSubtree(TreeNode root1, TreeNode root2),用来判断root2是不是root1的子树。
subTree(TreeNode root1,TreeNode root2)用来判断从root1节点起的最上面的子树是不是和root2相等。
代码:
/**
* 输入两棵二叉树A和B,判断树B是不是A的子结构。
* @author hongbin.gao
*
* 思路:现在A中寻找与B树的根节点值相同的节点,然后再判断这个节点下面是不是与B树相同
*
*/
class TreeNode{ //树节点
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val){
this.val = val;
}
}
public class HasSubtree {
public static void main(String[] args){
TreeNode head1 =new TreeNode(1);
TreeNode p1 = new TreeNode(8);
TreeNode p2 = new TreeNode(7);
TreeNode p3 = new TreeNode(9);
TreeNode p4 = new TreeNode(2);
TreeNode p5 = new TreeNode(4);
TreeNode p6 = new TreeNode(7);
head1.left = p1; head1.right =p2;
p2.left = p2.right = null;
p1.left = p3; p1.right = p4;
p3.left = p3.right =null;
p4.left = p5; p4.right = p6;
p5.left = p5.right = null;
p6.left = p6.right =null;
TreeNode head2 =new TreeNode(8);
TreeNode q1 = new TreeNode(9);
TreeNode q2 = new TreeNode(2);
head2.left = q1;
head2.right = q2;
q1.left = q1.right = null;
q2.left = q2.right =null;
boolean result = hasSubtree(head1,head2);
System.out.println(result);
}
public static boolean hasSubtree(TreeNode root1, TreeNode root2){
if(root2 == null) //root2为null
return true;
if(root1 == null && root2 != null) //root1为null,root2不为null,之间返回false。
return false;
if(subtree(root1,root2))
return true;
else
return (hasSubtree(root1.left,root2) || hasSubtree(root1.right, root2));
}
public static boolean subtree(TreeNode root1,TreeNode root2){ //root1最上面是不是和root2相等
if(root2 == null)
return true;
if(root1 == null && root2 != null)
return false;
if(root1.val != root2.val)
return false;
if(root1.val == root2.val){
if(subtree(root1.left, root2.left) && subtree(root1.right,root2.right))
return true;
else
return false;
}
else
return false;
}
}