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

    二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
    示例 1:
    image.png
    输入:root = [3,4,5,1,2], subRoot = [4,1,2]
    输出:true
    示例 2:

    输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
    输出:false

    1. /**
    2. * Definition for a binary tree node.
    3. * function TreeNode(val, left, right) {
    4. * this.val = (val===undefined ? 0 : val)
    5. * this.left = (left===undefined ? null : left)
    6. * this.right = (right===undefined ? null : right)
    7. * }
    8. */
    9. /**
    10. * @param {TreeNode} root
    11. * @param {TreeNode} subRoot
    12. * @return {boolean}
    13. */
    14. var isSubtree = function (root, subRoot) {
    15. // 二叉树的递归分为「遍历」和「分解问题」两种思维模式,这道题需要用到「遍历」的思维。
    16. if (root === null) { return subRoot === null };
    17. // 判断以root为根的二叉树是否和subRoot 相同
    18. const isSameTree = (p, q) => {
    19. if (!p && !q) return true;
    20. if (
    21. p && q &&
    22. p.val === q.val &&
    23. isSameTree(p.left, q.left) &&
    24. isSameTree(p.right, q.right)
    25. ) {
    26. return true
    27. } else {
    28. return false
    29. }
    30. }
    31. if(isSameTree(root, subRoot)) {
    32. return true
    33. }
    34. // 去子树中判断是否有相同树
    35. return isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot)
    36. };

    image.png