【树-简单】100. 相同的树

本文介绍了一种通过先序遍历和中序遍历来判断两个二叉树是否完全相同的方法,并给出了四种不同的实现方式,包括递归方法、广度优先搜索等,帮助读者深入理解二叉树的遍历及比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目】

【代码】
在这里插入图片描述

class Solution:
    def preOrder(self,root,flag,depth):
        if not root:
            return
        self.a_pre[flag].append(str(root.val)+str(depth))
        self.preOrder(root.left,flag,depth+1)
        self.preOrder(root.right,flag,depth+1)
    
    def inOrder(self,root,flag,depth):
        if not root:
            return
        self.inOrder(root.left,flag,depth+1)
        self.b_in[flag].append(str(root.val)+str(depth))
        self.inOrder(root.right,flag,depth+1)

    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        self.a_pre=[[],[]]
        self.b_in=[[],[]]
        self.preOrder(p,0,0)
        self.preOrder(q,1,0)
        self.inOrder(p,0,0)
        self.inOrder(q,1,0)
        print(self.a_pre)
        print(self.b_in)
        return self.a_pre[0]==self.a_pre[1] and self.b_in[0]==self.b_in[1]

【简化版本】
在这里插入图片描述

class Solution:
    def preOrder(self,root,flag,depth):
        if not root:
            return
        self.a_pre[flag].append(str(root.val)+str(depth))
        self.preOrder(root.left,flag,depth+1)
        self.b_in[flag].append(str(root.val)+str(depth))
        self.preOrder(root.right,flag,depth+1)
    
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        self.a_pre=[[],[]]
        self.b_in=[[],[]]
        self.preOrder(p,0,0)
        self.preOrder(q,1,0)
        return self.a_pre[0]==self.a_pre[1] and self.b_in[0]==self.b_in[1]

【广度优先】
在这里插入图片描述

class Solution:
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        if not p or not q:
            return p==q
        ans=[[],[]]
        loc=[[],[]]
        def deal(flag):
            depth=0
            while queue_p:
                sz=len(queue_p)
                for i in range(sz):
                    node=queue_p.pop(0)
                    print(node.val)
                    ans[flag].append((node.val,depth))
                    if node.left:
                        queue_p.append(node.left)
                        loc[flag].append(0)
                    if node.right:
                        queue_p.append(node.right)
                        loc[flag].append(1)
                depth+=1
        queue_p=[p]
        deal(0)
        queue_p=[q]
        deal(1)
        return ans[0]==ans[1] and loc[0]==loc[1]

【方法4】
在这里插入图片描述

class Solution:
    def preOrder(self,p,q):
        if not p or not q:
            return p is None and q is None
        elif p.val!=q.val:
            return False
        return self.preOrder(p.left, q.left) and self.preOrder(p.right,q.right)
    
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        return self.preOrder(p,q)

【方法5】
在这里插入图片描述

class Solution:
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        if not p or not q:
            return not p and not q
        elif p.val!=q.val:
            return False
        return self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值