100. Same Tree 相同的樹

給定兩個二叉樹,編寫一個函數來檢驗它們是否相同。python

若是兩個樹在結構上相同,而且節點具備相同的值,則認爲它們是相同的。ide

示例 1:函數

輸入:spa

1         1
      / \       / \
     2   3     2   3

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

輸出: true
示例 2:code

輸入:遞歸

1          1
      /           \
     2             2

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

輸出: false
示例 3:it

輸入:class

1         1
      / \       / \
     2   1     1   2

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

輸出: false二叉樹

深度優先搜索

若是兩個二叉樹都爲空,則兩個二叉樹相同。若是兩個二叉樹中有且只有一個爲空,則兩個二叉樹必定不相同。搜索

若是兩個二叉樹都不爲空,那麼首先判斷它們的根節點的值是否相同,若不相同則兩個二叉樹必定不一樣,若相同,再分別判斷兩個二叉樹的左子樹是否相同以及右子樹是否相同。這是一個遞歸的過程,所以能夠使用深度優先搜索,遞歸地判斷兩個二叉樹是否相同。

Code

def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        if not p and not q:
            return True
        elif not p or not q:
            return False
        elif p.val != q.val:
            return False
        else:
            return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)

複雜度分析

時間複雜度:O(min(m,n)),其中 m 和 n 分別是兩個二叉樹的節點數。對兩個二叉樹同時進行深度優先搜索,只有當兩個二叉樹中的對應節點都不爲空時纔會訪問到該節點,所以被訪問到的節點數不會超過較小的二叉樹的節點數。

空間複雜度:O(min(m,n)),其中 m 和 n 分別是兩個二叉樹的節點數。空間複雜度取決於遞歸調用的層數,遞歸調用的層數不會超過較小的二叉樹的最大高度,最壞狀況下,二叉樹的高度等於節點數。