输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构
public class Solution {
/*****************************
* 判断树B是否是树A的子结构
* @param root1 树A
* @param root2 树B
* @return 树A是否是树B的子结构
*/
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
//空结构判断
//当A为空时 B不可能是A的子树;题目又规定空树不是任何树的子树
if(root1==null||root2==null)
{
return false;
}
//采用先序遍历A树
if(root1.val==root2.val)
{
//如果两子树相同 即已经查找到子树
if(changeSameTree(root1, root2))
return true;
}
//如果没找到 继续查找左子树和右子树
return HasSubtree(root1.left, root2)||HasSubtree(root1.right, root2);
}
/************************
* 判断两颗树是否相同 采用先序遍历的方法
* @param root1 树1根节点
* @param root2 树2根节点
* @return 两树是否完全相同
*/
public boolean changeSameTree(TreeNode root1,TreeNode root2)
{
//当大树节点为空 小树节点不为空时 小树不是大树的子树
if(root1==null&&root2!=null)
{
return false;
}
//小树节点为空时 无论大树是否为空 都返回true
if(root2==null)
{
return true;
}
//两节点都不为空时 比较两树的左右节点
if(root1.val==root2.val)
{
//两节点值相同 比较左右孩子节点
return changeSameTree(root1.left,root2.left)&&changeSameTree(root1.right,root2.right);
}
//两节点不同
else
{
return false;//则B并非当前A的子树
}
}
}
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}