题目
输入两棵二叉树A和B,判断B是不是A的子结构。
思路
- 首先在A树中找到树B的根节点node,再比较两个树node和B是否相等;
- 比较node是否包含B的树结构:
采用递归的方式,遍历时只要有一个结点值不相等,就返回false;
当B的子结点到达尾部null时,返回true;
而如果B的子节点不为null,node的子结点为null时,要返回false,这个检查要在比较树结点值前进行,否则会NullPointerException报错。
注意:程序的鲁棒性,采用防御式编程,处理无效输入。当二叉树A和B有一个为null时,返回false。
public class HasSubtree {
public static boolean hasSubtree(BiTreeNode root1, BiTreeNode root2){
boolean result =false;
if (root1!=null&&root2!=null){
if (root1.data==root2.data)
result=doesTree1HaveTree2(root1,root2);
if (!result)
result=hasSubtree(root1.leftChild,root2);
if (!result)
result=hasSubtree(root1.rightChild,root2);
}
return result;
}
public static boolean doesTree1HaveTree2(BiTreeNode root1,BiTreeNode root2){
if (root2==null)
return true;
if (root1==null)
return false;
if (root1.data!=root2.data){
return false;
}
return doesTree1HaveTree2(root1.leftChild,root2.leftChild)&&doesTree1HaveTree2(root1.rightChild,root2.rightChild);
}
public static void main(String[] args) {
//斜二叉树
int[] array1={1,2,3,4,5,6,7};
int[] array2={2,3,4};
BiTreeNode root1=BiTreeNode.create(array1);
BiTreeNode root2=BiTreeNode.create(array2);
System.out.println(hasSubtree(root1,root2));
}
}