当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~
在此感谢左大神让我对算法有了新的感悟认识!
原问题
给定树的根节点r1和r2,判断r1是否包含r2的拓扑结构
如:
t1:

t2:

这里头结点123完全包含头结点6,因此结果为true
将问题下发到每一个子树
1、判断当前节点为根节点时是否包含r2,如果不包含那么判断左节点是否存在,不存在判断右节点是否存在r2
2、判断当前节点为根节点的子树和r2同步遍历是否能够涵盖r2
方案一:
/**
* mycheck1 是判断r1是否包含r2的
* @param root1
* @param root2
* @return
*/
public static boolean myCheck(MyTreeNode root1, MyTreeNode root2){
if (root2 == null){
return true;
}else if (root1 == null){
return false;
}
// 首先判断当前节点为头同步遍历是否包含root2,如果不是,则判断左边是否包含,再判断右边是否包含
return myCheck2(root1, root2) || myCheck(root1.getLeft(), root2) || myCheck(root1.getRight(), root2);
}
/**
* mycheck2 是判断root1和root2同步遍历时是否相同
* @param root1
* @param root2
* @return
*/
private static boolean myCheck2(MyTreeNode root1, MyTreeNode root2) {
if (root2 == null){
return true;
}else if (root1 == null){
return false;
}
return root1.getData().equals(root2.getData())
&& myCheck2(root1.getLeft(), root2.getLeft())
&& myCheck2(root1.getRight(), root2.getRight());
}
正在学习中
正在学习中
这道题比较简单,但是存在一个嵌套递归和同步递归遍历
同步递归挺重要的后面的题还会用到,并且同步递归可以判断很多问题,比如树是否是镜像对称树就可以使用同步遍历左右节点完全相同返回true等等。
到这里慢慢发现二叉树类型的问题在么有最优解的情况下,这个思路基本是万能的。
方案和代码仅提供学习和思考使用,切勿随意滥用!如有错误和不合理的地方,务必批评指正~
如果需要git源码可邮件给2260755767@qq.com
再次感谢左大神对我算法的指点迷津!