题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:
先通过遍历A树找到与B树根节点相等的节点(先拿A树的根节点比较,不匹配的话再利用递归思想拿A树根节点的左孩子和右孩子进行比较)。
如果B树的根节点和A树中所有节点都不匹配的话就直接返回 false;如果B树的根节点在A树中有匹配的话再调用另外一个函数来分别比较匹配后的根节点的左子树和右子树是否也都匹配,在这个函数中需要更多的考虑节点为空的情况。
测试用例:
1. 功能测试:树A和树B都是普通的二叉树;树B是或不是树A的子结构。
2. 特殊测试:两棵二叉树的一个或者两个根节点都为空;二叉树的所以子节点都没有左子树或者右子树。
public class test_twenty_six {
public boolean HasSubtree(TreeNode root1, TreeNode root2){
//设置默认的结果为false,如果一旦匹配result就设置为true
//匹配不成功就返回默认的false
boolean result = false;
//需要两棵树都不会空才会进行判断,否则直接返回false
if(root1 != null && root2 != null){
//如果找到根节点匹配的节点,调用下面函数继续比较子节点是否也匹配
if(root1.val == root2.val){
result = doesTree1haveTree2(root1, root2);
}
//如果当前节点不匹配,分别遍历Tree1的左孩子和右孩子继续比较
if(!result){
result = HasSubtree(root1.left, root2);
}
if(!result){
result = HasSubtree(root1.right, root2);
}
}
return result;
}
public boolean doesTree1haveTree2(TreeNode node1, TreeNode node2){
//如果Tree2遍历完了都能匹配上
if(node2 ==null)return true;
//如果Tree2没有匹配完,Tree1就先匹配完了,返回false
if(node1 == null)return false;
//如果有一个节点没有匹配上,返回false
if(node1.val != node2.val)return false;
//除去上述要考虑的特殊情况外,根节点匹配上了之后就分别匹配左孩子和右孩子
return doesTree1haveTree2(node1.left, node2.left) && doesTree1haveTree2(node1.right, node2.right);
}
}