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

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

输入:p = [1,2,1], q = [1,1,2]
输出:false
解题思路
- 首先当两根节点都为空时,返回True;
- 当其中一个根节点为空,另一个根节点不为空,返回False;
- 当两根节点都不为空时,判断根节点的值是否相等;接下来判断左子树和右子树是否相同,若都相同,则返回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
1286

被折叠的 条评论
为什么被折叠?



