题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
示例1
输入
{8,8,#,9,#,2,#,5},{8,9,#,2}
返回值
true
解题思路
参考https://blog.csdn.net/qinian_ztc/article/details/104731375
首先确定什么是子结构-就是是原来树的一部分就行,没有必要就是一颗子树
如图为一对子树结构
那么思路大概如下
先在A树中找到和B树根节点一样的节点,之后判断左右子树是否相等。假如B树没了,A树还有是可以的。反之不行
需要从A树的根节点依次遍历直到找到
可以归纳为-取之参考博客
1.在大树中找到和小树根节点相同的节点。
2.然后以此节点为根节点,在大树上往下搜索对比小书左右节点是否相同,不同则返回false
3.如果2步中最后返回false 回到第一步,从大树的左子树找和小树根节点相同的节点。
4.如果3步中最后返回false 回到第一步,从大树的右子树找和小树根节点相同的节点。
java代码
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1==null||root2==null) return false;
boolean ans=false;
if(root1.val==root2.val){
ans=Subtree(root1,root2);
}
if(!ans) ans=HasSubtree(root1.left,root2);
if(!ans) ans=HasSubtree(root1.right,root2);
return ans;
}
public boolean Subtree(TreeNode root1,TreeNode root2){
if(root2==null) return true;
if(root1==null) return false;
if(root1.val != root2.val) return false;
return Subtree(root1.left,root2.left) && Subtree(root1.right,root2.right);
}
}
京公网安备 11010502036488号