↓ Skip to main content
  1. Science/
  2. Computer/

0100.Same Tree

Solution

from typing import Optional

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

class Solution:
    def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
        if p == q:
            return True

        if p is None or q is None or p.val != q.val:
            return False

        return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)

if __name__ == "__main__":
# 测试1:相同树
    p1 = TreeNode(1, TreeNode(2), TreeNode(3))
    q1 = TreeNode(1, TreeNode(2), TreeNode(3))
    print(Solution().isSameTree(p1, q1)) # True

# 测试2:结构不同
    p2 = TreeNode(1, TreeNode(2))
    q2 = TreeNode(1, None, TreeNode(2))
    print(Solution().isSameTree(p2, q2)) # False

# 测试3:一棵空,一棵非空
    p3 = None
    q3 = TreeNode(0)
    print(Solution().isSameTree(p3, q3)) # False

# 测试4:两棵都空
    p4 = None
    q4 = None
    print(Solution().isSameTree(p4, q4)) # True

Solution 2

from typing import Optional
from collections import deque

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

class Solution:
    def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
        if p == q:
            return True
        if p is None or q is None:
            return False
        q1, q2 = deque([p]), deque([q])
        while q1 and q2:
            a, b = q1.popleft(), q2.popleft()
            aval = a.val
            bval = b.val
            if a.val != b.val:
                return False
            la, ra = a.left, a.right
            lb, rb = b.left, b.right
            # 左子节点结构不一致:一个有,一个无
            if (la and not lb) or (lb and not la):
                return False
            # 右子节点结构不一致
            if (ra and not rb) or (rb and not ra):
                return False
            if la:
                q1.append(la)
                q2.append(lb)
            if ra:
                q1.append(ra)
                q2.append(rb)
        return True

if __name__ == "__main__":
# 测试1 相同
    p1 = TreeNode(1, TreeNode(2), TreeNode(3))
    q1 = TreeNode(1, TreeNode(2), TreeNode(3))
    print(Solution().isSameTree(p1, q1)) # True

# 测试2 结构不同
    p2 = TreeNode(1, TreeNode(2))
    q2 = TreeNode(1, None, TreeNode(2))
    print(Solution().isSameTree(p2, q2)) # False

# 测试3 值不同
    p3 = TreeNode(1, TreeNode(2), TreeNode(3))
    q3 = TreeNode(1, TreeNode(99), TreeNode(3))
    print(Solution().isSameTree(p3, q3)) # False

# 测试4 两棵空
    p4 = None
    q4 = None
    print(Solution().isSameTree(p4, q4)) # True

# 测试5 一空一有
    p5 = None
    q5 = TreeNode(5)
    print(Solution().isSameTree(p5, q5)) # False