题目
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
基础知识
子树的意思是包含了一个节点,就得包含这个节点下的所有节点,一棵大小为n的二叉树有n个子树,就是分别以每个节点为根的子树。
子结构的意思是包含了一个节点,可以只取左孩子和右孩子 而不是左子树右子树
例子:
建树是层次遍历
根据测试用例来看 应该是必须有左右孩子 不能只匹配到一个
思路
主函数 用于找到子结构的根节点
写个judge 函数 用于遍历判断每个节点都相等
代码
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1 == null || root2 ==null){
//如果有一个为空 则没有匹配到 无相同根节点
return false;
}
if(root1.val == root2.val){
if(judge(root1,root2))
return true;
}
//遍历左子树 或者右子树
return HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2);
}
public boolean judge(TreeNode root,TreeNode subtree){
//表明匹配完毕,先判断子树 再判断树 排除了两树同时到达空 被误判的情况
if(subtree == null){
return true;
}
//大树先为空 没有匹配到
if(root == null){
return false;
}
if(root.val == subtree.val){
return judge(root.left,subtree.left)&&judge(root.right,subtree.right);
}
//不相等就说明没有匹配到 返回false
return false;
}
}