LeetCode. 572. 另一棵树的子树

72 阅读1分钟

题目

leetcode.cn/problems/su…

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

思路

需要找到所有在 root 中 val 值与 subRoot 相等的子树,因为会有重复的值所以需要通过一个集合收集起来,

遍历集合判断叔的结构和值如果有一个满足条件就返回 true

代码

public class Solution {
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        List<TreeNode> nodeList = new ArrayList<>();
        findRoot(root, subRoot, nodeList);
        if (nodeList.isEmpty()) {
            return false;
        }
        for (TreeNode treeNode : nodeList) {
            boolean dfs = dfs(treeNode, subRoot);
            if (dfs) {
                return true;
            }
        }
        return false;
    }

    private void findRoot(TreeNode root, TreeNode subRoot, List<TreeNode> list) {
        if (root == null) {
            return;
        }
        if (root.val == subRoot.val) {
            list.add(root);
        }
        findRoot(root.left, subRoot, list);
        findRoot(root.right, subRoot, list);
    }

    private boolean dfs(TreeNode root, TreeNode subRoot) {

        if (root.val != subRoot.val) {
            return false;
        }
        TreeNode rootLeft = root.left;
        TreeNode subRootLeft = subRoot.left;
        if (rootLeft == null && subRootLeft != null || rootLeft != null && subRootLeft == null) {
            return false;
        }
        TreeNode rootRight = root.right;
        TreeNode subRootRight = subRoot.right;
        if (rootRight == null && subRootRight != null || rootRight != null && subRootRight == null) {
            return false;
        }
        boolean rightRes =true;
        if (rootRight != null) {
            rightRes = dfs(rootRight, subRootRight);
        }
        boolean leftRes = true;
        if (rootLeft != null) {
            leftRes = dfs(rootLeft, subRootLeft);
        }
        return rightRes && leftRes;
    }


    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode() {
        }

        TreeNode(int val) {
            this.val = val;
        }

        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }
}

题解

leetcode.cn/problems/su…