剑指 Offer 26. 树的子结构(递归)

题目
在这里插入图片描述
我的想法是找到A树每一个与B树跟结点相同的结点 放入List中
遍历list中的结点当做起点去判断 是否B树是A树的子结构

class Solution {
    
    
    ArrayList<TreeNode> list = new ArrayList<>();
    public void find(TreeNode a,TreeNode b){
    
    
        if (a == null) return;
        if (a.val == b.val) list.add(a);
        find(a.left,b);
        find(a.right,b);
    }
    public boolean isSub(TreeNode A,TreeNode B){
    
    
        if (B == null) return true;//B树遍历到null时说明是子树
        if (A == null) return false;//A树为nullB树不为null说明结构不同
        //值相等并且左右子树都相等
        return ((A.val == B.val) && isSub(A.left,B.left) && isSub(A.right,B.right));
    }
    public boolean isSubStructure(TreeNode A, TreeNode B) {
    
    
        if (A == null || B == null) return false;
        boolean flag = false;
        find(A,B);
        for (TreeNode root : list) {
    
    
            if (solution(root,B)){
    
    
                flag = true;
                break;
            } 
        }
        return flag;
    }
}

和题解学的简洁写法 真的妙啊 时间复杂不知道为什么更快 玄学

    public boolean isSub(TreeNode A,TreeNode B){
    
    
        if (B == null) return true;//B树遍历到null时说明是子树
        if (A == null) return false;//A树为nullB树不为null说明结构不同
        //值相等并且左右子树都相等
        return ((A.val == B.val) && isSub(A.left,B.left) && isSub(A.right,B.right));
    }
    public boolean isSubStructure(TreeNode A, TreeNode B) {
    
    
        if (A == null || B == null) return false;
        //当前结点是否为B树的起点 或者左儿子和右儿子
        return (isSub(A,B) || isSubStructure(A.left,B) || isSubStructure(A.right ,B));
    }

猜你喜欢

转载自blog.csdn.net/qq_43434328/article/details/115117512