https://leetcode.com/problems/same-tree/
给定两棵二叉树的根节点p和q,判断两棵树是否相同。
Input:p = [1,2,3],q = 1,2,3
Output:true
Input: p = [1,2,1], q = [1,null,2]
Output: false
解决思路和【leetcode-Python】-Tree-101. Symmetric Tree类似,第一种思路是利用递归来解决。
递归函数输出两棵根节点分别为p q的二叉树是否相同的判断结果,结束条件为p、q均为None或仅有一个为None,或p.val != q.val;
将问题拆解为判断(p.val == q.val)&&(p.leftsubtree和q.leftsubtree相同)&&(p.rightsubtree和q.rightsubtree相同)
# 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: TreeNode, q: TreeNode) -> bool:
if(p == None and q == None):
return True
if(p == None or q == None):
return False
if(p.val != q.val):
return False
return self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)
时间复杂度为O(n), n为树中节点个数。
最好情况下空间复杂度为O(log(n)),最差情况下空间复杂度为O(n)。
第二种思路是利用迭代来解决。利用Python中的list实现栈的操作,依次判断对应位置的二叉树节点的值是否相同。
# 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: TreeNode, q: TreeNode) -> bool:
stack = [(p,q)]
while(len(stack) != 0):
l, r = stack.pop()
if(l == None and r == None):
continue;
if(l == None or r == None):
return False
if(l.val != r.val):
return False
stack.append((l.left,r.left))
stack.append((l.right,r.right))
return True
由于每个节点仅被访问一次,时间复杂度为O(n), n为树中节点个数。
最好情况下空间复杂度为O(log(n)),最差情况下空间复杂度为O(n)。