题目:输入两棵二叉树A 和B,判断B是不是A的子结构。(B树是否在A树中)
思路:第一步在树A中找到和B的根结点的值一样的结点R, 第二步再判断树A中以R为根结点的子树是不是包含和树B一样的结构。
package offer;
public class SubTree {
public static void main(String[] args) {
BinaryTreeNode nodeA1 = new BinaryTreeNode(8);
BinaryTreeNode nodeA2 = new BinaryTreeNode(8);
BinaryTreeNode nodeA3 = new BinaryTreeNode(7);
BinaryTreeNode nodeA4 = new BinaryTreeNode(9);
BinaryTreeNode nodeA5 = new BinaryTreeNode(2);
BinaryTreeNode nodeA6 = new BinaryTreeNode(4);
nodeA1.left = nodeA2;
nodeA1.right = nodeA3;
nodeA2.left = nodeA4;
nodeA2.right = nodeA5;
BinaryTreeNode nodeB1 = new BinaryTreeNode(8);
BinaryTreeNode nodeB2 = new BinaryTreeNode(2);
BinaryTreeNode nodeB3 = new BinaryTreeNode(9);
nodeB1.left = nodeB3;
nodeB1.right = nodeB2;
System.out.println(HasSubTree(nodeA1, nodeB1));
System.out.println("----------------");
BinaryTreeNode nodeNull = null;
System.out.println(HasSubTree(nodeA1,nodeNull));
}
public static boolean HasSubTree(BinaryTreeNode root1, BinaryTreeNode root2){
boolean result = false;
if(root1!=null && root2!=null){
if(root1.val==root2.val)
result = DoesTree1HaveTree2(root1,root2);
if(!result)
result = HasSubTree(root1.left,root2);
if(!result)
result = HasSubTree(root1.right,root2);
}
return result;
}
private static boolean DoesTree1HaveTree2(BinaryTreeNode root1, BinaryTreeNode root2){
if(root2==null)
return true;
if(root1==null)
return false;
if(root1.val!=root2.val)
return false;
return DoesTree1HaveTree2(root1.left,root2.left) && DoesTree1HaveTree2(root1.right,root2.right);
}
}