leedcode 相同的树

自己写的有问题   即使先序+中序的结果一样 也不能确定同一棵树

# 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 __init__(self):
        self.pre_res = list()
        self.in_res = list()

    def preorder(self, node):
        if node:
            self.pre_res.append(node.val)
            self.preorder(node.left)
            self.preorder(node.right)

    def inorder(self, node):
        if node:
            self.inorder(node.left)
            self.in_res.append(node.val)
            self.inorder(node.right)

    def isSameTree(self, p, q):
        self.pre_res = []  # 清空先前的结果
        self.in_res = []   # 清空先前的结果

        self.preorder(p)
        p_pre = self.pre_res
        self.pre_res = []  # 为下一次遍历清空结果

        self.inorder(p)
        p_in = self.in_res
        self.in_res = []   # 为下一次遍历清空结果

        self.preorder(q)
        q_pre = self.pre_res
        self.pre_res = []  # 为下一次遍历清空结果

        self.inorder(q)
        q_in = self.in_res
        self.in_res = []   # 为下一次遍历清空结果

        return p_pre == q_pre and p_in == q_in

gpt提供的递归:

class Solution:
    def isSameTree(self, p, q):
        # 如果两个节点都为空,则认为相同
        if not p and not q:
            return True
        # 如果一个节点为空而另一个不为空,或者节点的值不相等,则认为不相同
        if not p or not q or p.val != q.val:
            return False
        # 递归比较左右子树
        return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)

 使用队列层层迭代判断

class Solution:
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        # 初始化队列
        queue = [p, q]

        while queue:
            # 从队列中取出两个节点
            pNode = queue.pop(0)
            qNode = queue.pop(0)
            # 若当前节点为空,则继续循环
            if pNode == None and qNode == None:
                continue
            # 如果其中一个节点为空,另一个不为空,则一定不相同
            if (pNode == None and qNode != None) or (pNode != None and qNode == None):
                return False
            # 如果两个节点皆不为空,但是节点的值不同,则一定不相同
            if pNode.val != qNode.val:
                return False
            # pNode 节点的左孩子和 qNode 节点的左孩子入队列
            queue.append(pNode.left)
            queue.append(qNode.left)
            # pNode 节点的右孩子和 qNode 节点的右孩子入队列
            queue.append(pNode.right)
            queue.append(qNode.right)

        return True

 

posted @ 2024-02-04 15:00  Junior_bond  阅读(8)  评论(0)    收藏  举报