# 【基础篇 - Day 14】 2020-11-14 - 100. 相同的树(03. 树 )

# 题目描述

输入:       1         1
          / \       / \
         2   3     2   3

        [1,2,3],   [1,2,3]

输出: true
输出: true

示例 2:

输入:      1          1
          /           \
         2             2

        [1,2],     [1,null,2]

输出: false
示例 3:

输入:       1         1
          / \       / \
         2   1     1   2

        [1,2,1],   [1,1,2]

输出: false 来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/same-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处

# 我的回答

# 解法一

# 时空复杂度

时间复杂度:O(n)

空间复杂度: O(1)

递归 把几种特殊情况判断下即可

var isSameTree = function (p, q) {
    if (!p && !q) return true
    if (!p || !q) return false
    if (q.val != p.val) return false
    return isSameTree(q.left, p.left) &&
        isSameTree(q.right, p.right)
};

# 解法二

时间复杂度:O(n)

空间复杂度: O(2n)

层序遍历

var isSameTree = function (p, q) {
    if (!p && !q) return true
    if (!p || !q) return false
    let PStack = [p]
    let QStack = [q]
    while (PStack.length) {
        const Pcurr = PStack.shift()
        const Qcurr = QStack.shift()
        console.log(Pcurr, Qcurr)
        if (Pcurr.val === Qcurr.val) {
            if (Pcurr.left && Qcurr.left) {
                PStack.push(Pcurr.left)
                QStack.push(Qcurr.left)
            } else if (!Pcurr.left && !Qcurr.left) {

            } else if (!Pcurr.left || !Qcurr.left) {
                return false
            }
            if (Pcurr.right && Qcurr.right) {
                PStack.push(Pcurr.right)
                QStack.push(Qcurr.right)
            } else if (!Pcurr.right && !Qcurr.right) {

            } else if (!Pcurr.right || !Qcurr.right) {
                return false
            }
        } else {
            return false
        }
    }
    return true
}

# 解法三

时间复杂度:O(n)

空间复杂度: O(n)

优化成一个栈 看着舒服了,从内存消耗上看 没有减少= =

var isSameTree = function (p, q) {
    let Stack = [{ p, q }]
    while (Stack.length) {
        const { p: currP, q: currQ } = Stack.shift()
        console.log(currQ, currP)
        if (!currP && !currQ) continue
        if (!currP || !currQ) return false
        if (currP.val !== currQ.val) return false
        Stack.push({
            p: currP.left,
            q: currQ.left
        })
        Stack.push({
            p: currP.right,
            q: currQ.right
        })
    }
    return true
}

https://github.com/leetcode-pp/91alg-2/issues/39#issuecomment-727695908

# 参考回答

Last Updated: 12/22/2022, 9:53:26 AM