题目:输入两棵二叉树A 和B,判断B 是不是A 的子结构。
编程序的时候,要注意安装思路一步一步来,根据条件判断好
package 剑指offer;
/*题目:输入两棵二叉树A 和B,判断B 是不是A 的子结构。*/
public class Test18 {
// 先判断根节点,再判断子树
public static class BinaryTreeNode {
int value;
BinaryTreeNode left;
BinaryTreeNode right;
}
public static boolean hasSubtree(BinaryTreeNode root1, BinaryTreeNode root2){
if(root1 == root2){
return true;
}
if(root2 == null){
return true;
}
if(root1 == null){
return false;
}
// 记录匹配结果
boolean result = false;
// 如果结点的值相等就,调用匹配方法
if (root1.value == root2.value) {
result = match(root1, root2);
}
// 如果匹配就直接返回结果
if (result) {
// 这样判断一下结果很重要,不能直接返回,直接返回会返回false
// 但是当不对时,下边应该接着执行
return true;
}
return hasSubtree(root1.left, root2) || hasSubtree(root1.right, root2);
}
public static boolean match(BinaryTreeNode root1, BinaryTreeNode root2){
if(root1 == root2){
return true;
}
if(root2 == null){
return true;
}
if(root1 == null){
return false;
}
if(root1.value == root2.value){
return match(root1.left, root2.left) && match(root1.right, root2.right);
}
return false;
}
public static void main(String args[]){
BinaryTreeNode root1 = new BinaryTreeNode();
root1.value = 8;
root1.right = new BinaryTreeNode();
root1.right.value = 7;
root1.left = new BinaryTreeNode();
root1.left.value = 8;
root1.left.left = new BinaryTreeNode();
root1.left.left.value = 9;
root1.left.right = new BinaryTreeNode();
root1.left.right.value = 2;
root1.left.right.left = new BinaryTreeNode();
root1.left.right.left.left = new BinaryTreeNode();
root1.left.right.left.left.value = 4;
root1.left.right.left.right = new BinaryTreeNode();
root1.left.right.left.right.value = 7;
BinaryTreeNode root2 = new BinaryTreeNode();
root2.value = 8;
root2.left = new BinaryTreeNode();
root2.left.value = 9;
root2.right = new BinaryTreeNode();
root2.right.value = 2;
System.out.println(hasSubtree(root1, root2));
System.out.println(hasSubtree(root2, root1));
System.out.println(hasSubtree(root1, root1.left));
System.out.println(hasSubtree(root1, null));
System.out.println(hasSubtree(null, root2));
System.out.println(hasSubtree(null, null));
}
}
光有思路不行,要转化成程序语言