描述
输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)
假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构
数据范围:
0 <= A的节点个数 <= 10000
0 <= B的节点个数 <= 10000
示例1
输入:
{8,8,7,9,2,#,#,#,#,4,7},{8,9,2}
返回值:
true
示例2
输入:
{1,2,3,4,5},{2,4}
返回值:
true
示例3
输入:
{1,2,3},{3,1} 返回值:
false
看完解析后,自己敲的代码:
递归代码:
public boolean HasSubtree(TreeNode root1,TreeNode root2) {//只是遍历找匹配的根节点而已
if(root2==null) return false;//空树不是任意一个树的子结构
if(root1==null) return false;//这颗子树肯定没有 返回false
if(root1.val==root2.val) {
//找到与树2根相同得节点了 "摘下"以root1为根的子树开始同步遍历
boolean f0=judge(root1,root2);
if(f0) return true;//找到了直接返回 不递归了
}
boolean f1=HasSubtree(root1.left,root2);//大体结构 先序遍历root1 找与root2根相同的节点
boolean f2=HasSubtree(root1.right,root2);//大体结构 先序遍历root1 找与root2根相同的节点 别忘记改成right
return f1||f2;//左子树或者右子树找到匹配的均可
}
//真正核心 同步遍历了
private boolean judge(TreeNode root1, TreeNode root2) {//此处初始root1 root2一定均不为null
if(root2==null) return true;//root2遍历到null了 root1可以多点没事,正常结尾 这个分支不需要走了
if(root1==null) return false;//此处root2肯定不为null root1却没了 必然不行
if(root1.val!=root2.val){
return false;//严格同步遍历到的值不等 肯定不行
}
//否则就是相等了 继续严格同步遍历下去即可
boolean f1=judge(root1.left,root2.left);//完全严格同步地先序遍历了
boolean f2=judge(root1.right,root2.right);//完全严格同步地先序遍历了
return f1&&f2;//左右子树都重来没有返回false才行
}
递归代码2:只是写好后再单纯地在语法层面进行了简化而已 (看起来又好厉害的亚子)
public boolean HasSubtree(TreeNode root1,TreeNode root2) {//只是遍历找匹配的根节点而已
if(root2==null||root1==null) return false;//空树不是任意一个树的子结构
if(root1.val==root2.val && judge(root1,root2)) return true;
return HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2);//左子树或者右子树找到匹配的均可
}
//真正核心 同步遍历了
private boolean judge(TreeNode root1, TreeNode root2) {//此处初始root1 root2一定均不为null
if(root2==null) return true;//root2遍历到null了 root1可以多点没事,正常结尾 这个分支不需要走了 正常结尾返回true
if(root1==null||root1.val!=root2.val) return false;//此处root2肯定不为null root1却没了 必然不行
return judge(root1.left,root2.left)&&judge(root1.right,root2.right);//左右子树都重来没有返回false才行
}
方法二:非递归解法
未完待续 TODO