LeetCode 剑指offer@26树的子结构 java双100%

思路

本题其实就是个匹配问题。
树的匹配问题,第一步找到第一个匹配点,然后进行逐个匹配,找到第一个匹配点可以采用层次便利或者bfs、dfs等等。本题我首先使用了层次遍历,但是发现结果只超过5%,改成递归形式的dfs之后超过100%。估计是某些特殊的测试用例使用层次遍历会很慢。
然后第二步 从该节点开始进行遍历匹配,也是有很多选择,我选择了递归的dfs,并且在每个节点上进行了一些短路操作以减少不必要的递归开销。

代码

package algorithm.jianzhiOffer;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class Q26 {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        if (A == null || B == null) return false;
        if (A.val == B.val) return sub(A, B);
        return isSubStructure(A.left, B) || isSubStructure(A.right, B);
//        Queue q = new LinkedList<>();
//        q.add(A);
//        boolean re = false;
//        while (!q.isEmpty()) {
//            TreeNode a = q.poll();
//            if (a.val == B.val){
//                re = sub(a, B);
//                return re;
//            }
//            if (a.left != null) q.add(a.left);
//            if (a.right != null) q.add(a.right);
//        }
// return re;

    }

    boolean sub(TreeNode a, TreeNode b) {
        if (b == null) return true;
        if (a == null || a.val != b.val || !sub(a.left, b.left)) return false;
        return sub(a.right, b.right);
    }
}

你可能感兴趣的:(LeetCode每日一题)