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 @   Junior_bond  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示