剑指offer26 :树的子结构,树的搜索与回溯算法,我悟了!

 先说思路,判断相同子结构,肯定要用得到回溯或递归,先判断两棵树的根节点值是否相等,一直查找,是否根节点具有相同的子节点,并且子节点的值是否相等。

若B是A的子树,则1、依次遍历树A的每个节点nodeA ;2、判断以nodeA节点为根节点的子树是否包含树B。

深度优先搜索dfs(helper()函数): 1、dfs起点:从根节点作为起点开始搜索树A和B的节点;2、递归出口:(1)如果B先深度优先搜索完,则说明B之前所有节点都与A匹配,直接return true;(2)如果A先深度优先搜索完,则说明B比A有多出来的节点,即A,B不匹配,直接return false;3、中途结束条件:(1)如果A或B节点值不相等,直接返回false;(2)A和B的节点值相等,继续对A和B的左子树和右子树进行遍历;

isSubStructure()方法:如果以节点A和节点B为根节点的树经过dfs(help()函数)匹配成功,直接返回true;否则,再次从A的左子树或右子树对B进行匹配。

时间复杂度:最坏情况,遍历A和B的所有节点m和n,O(mn)

空间复杂度:最坏情况,遍历完A,完成匹配或不匹配,O(m)

class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        if(A==null || B==null){
            return false;
        }

        //节点A的值等于节点B的值 且 节点A的左子结构等于节点B的左子结构 且 节点A的右子结构等于B的右子结构
        //if(A.val == B.val && (helper(A.left,B.left) && helper(A.right,B.right))){
        if(helper(A,B)) {
            return true;
        }

        //节点A的值不等于节点B的值 查找A的左子结构和B是否相等 查找A的右子结构和B是否相等
        return isSubStructure(A.left,B) || isSubStructure(A.right,B);
    }

    public boolean helper(TreeNode root1, TreeNode root2){
        if(root2 == null) { //如果root2没有子结构 则为真
            return true; 
        }
        if(root1 == null && root2 != null) { //如果root1没有子结构但root2有子结构 则为假
            return false;
        }
        if(root1.val == root2.val){ //如果root1和root2的值相等 则再去寻找root1和root2的左子节点和右子节点
            return helper(root1.left, root2.left) && helper(root1.right, root2.right);
        }else{
            return false;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七层楼BB

请我喝杯咖啡吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值