LeeCode题目:相同的树


题目描述

给定两棵二叉树的根节点p和q,编写函数来检查这两棵树是否相同。判定相同的条件为:两棵二叉树结构相同,并且同一位置的节点的值相同。


示例

示例1
输入:p = [1,2,3], q = [1,2,3]
输出:true
示例2
输入:p = [1,2,1], q = [1,1,2]
输出:false

解题思路

  1. 首先当两根节点都为空时,返回True;
  2. 当其中一个根节点为空,另一个根节点不为空,返回False;
  3. 当两根节点都不为空时,判断根节点的值是否相等;接下来判断左子树和右子树是否相同,若都相同,则返回True,否则返回False.

代码实现

# 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 == None:
            return True
        elif (p==None and q != None) or (p != None and q==None):
            return False
        else:
            if (p.val == q.val) and self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right):
                return True
            return False
                    

上面代码采用的是递归算法,也可以使用迭代算法,利用栈对树进行DFS或BFS

# 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:
        # 利用栈和dfs
        # 首先定义栈,并将两个根节点放入栈中
        stack = [(p,q)]
        while stack:
            node1 ,node2 = stack.pop()
            #当两个节点都为空时,继续循环,遍历其他节点受否相同
            if not node1 and not node2:
                continue
            # 当其中一个节点为空,另一节点不为空,返回False
            elif None in [node1,node2]:
                return False
            else:
            # 当两个节点都不为空时,检查节点值是否相同,若相同则将比较的两节点的右节点与左节点放入栈中
                if node1.val != node2.val:
                    return False
                stack.append((node1.right,node2.right))
                stack.append((node1.left,node2.left))
        # 当栈为空时,表明所有节点已经遍历,且值都相同,返回True
        return True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值