列表

详情


面试题 04.10. 检查子树

检查子树。你有两棵非常大的二叉树:T1,有几万个节点;T2,有几万个节点。设计一个算法,判断 T2 是否为 T1 的子树。

如果 T1 有这么一个节点 n,其子树与 T2 一模一样,则 T2 为 T1 的子树,也就是说,从节点 n 处把树砍断,得到的树与 T2 完全相同。

注意:此题相对书上原题略有改动。

示例1:

 输入:t1 = [1, 2, 3], t2 = [2]
 输出:true

示例2:

 输入:t1 = [1, null, 2, 4], t2 = [3, 2]
 输出:false

提示:

  1. 树的节点数目范围为[0, 20000]。

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool checkSubTree(TreeNode* t1, TreeNode* t2) { } };

python3 解法, 执行用时: 88 ms, 内存消耗: 23.6 MB, 提交时间: 2022-11-18 11:26:23

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def checkSubTree(self, t1: TreeNode, t2: TreeNode) -> bool:
        if not t2:
            return True
        if t1 and t2:
            return self.isSame(t1, t2) or self.checkSubTree(t1.left, t2) or self.checkSubTree(t1.right, t2)
        return False

    def isSame(self, p, q):
        if not q:
            return True
        if not p:
            return False
        return p.val == q.val and self.isSame(p.left, q.left) and self.isSame(p.right, q.right)

golang 解法, 执行用时: 24 ms, 内存消耗: 7.7 MB, 提交时间: 2022-11-18 11:25:39

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func checkSubTree(t1 *TreeNode, t2 *TreeNode) bool {
    if t2 == nil {
        return true
    } else if t1 != nil && t2 != nil {
        return isSame(t1, t2) || checkSubTree(t1.Left, t2) || checkSubTree(t1.Right, t2) 
    }
    return false
}

func isSame(p, q *TreeNode) bool {
    if q == nil {
        return true
    } else if p == nil {
        return false
    }
    return p.Val == q.Val && isSame(p.Left, q.Left) && isSame(p.Right, q.Right)
}

上一题