相同的树 ---- LeetCode(Python3实现)

博客围绕判断两棵二叉树是否相同展开。题目要求两树结构相同且节点值相同则判定为相同。给出两种解法,一是递归求解,判断节点是否为空及值是否相等;二是分别层次遍历两棵树,将结果存列表后比较列表是否相等。

一、题目

题目链接:https://leetcode-cn.com/problems/same-tree/

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入:       1         1
          / \       / \
         2   3     2   3

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

输出: true

示例 2:

输入:      1          1
          /           \
         2             2

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

输出: false

示例 3:

输入:       1         1
          / \       / \
         2   1     1   2

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

输出: false

二、分析及代码

1.递归求解:

    递归是一种比较简单的实现方法,对于传入的每个节点,我们判断是否都为空,若都为空,则返回True,否则只要有一个为空,返回False,否则说明都不为空,此时可以判断两个节点的值是否相等,若不相等,直接返回False,若相等,则调用自己,将左节点和右节点分别传入判断。代码如下:

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

class Solution:
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        if p and q:
            if p.val==q.val:
                return self.isSameTree(p.left, q.left) and self.isSameTree(p.right,q.right)
            else:
                return False
        else:
            if q==None and p==None:
                return True
            else:
                return False

 2.分别层次遍历两棵树,将遍历结果存放到列表中,最后比较这两个列表是否相等即可。代码如下:

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

class Solution:
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        def cengci(root):
            if root==None:
                return []
            presub = [root]
            res = []
            p = root
            sub = []
            while p!=None or len(presub)!=0:
                while len(presub)!=0:
                    p = presub.pop(0)
                    if p!=None:
                        res.append(p.val)
                        sub.append(p.left)
                        sub.append(p.right)
                    else:
                        res.append(None)
                presub = sub
                sub = []
                        
            return res
        p = cengci(p)
        q = cengci(q)
        print(p)
        print(q)
        return p==q
                    
                    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值