一、leetcode刷题
1.leetcode题目101 对称二叉树(easy):
①递归思路:(本题的思路很重要):对于二叉树是否对称,要比较的是根节点的左子树和右子树是不是相互翻转的,其实要比较的是两个树,所以在递归遍历的过程中,也是要同时遍历两棵树。
递归三部曲:确定递归函数的参数和返回值、确定终止条件、确定单层递归的逻辑。
- 确定递归函数的参数和返回值:参数为左子树节点和右子树节点
- 确定终止条件:不对称 返回False;对称,返回True;要注意为空的情况
- 确定单层递归的逻辑:比较外侧、内侧是否对称
解决:
# 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 compare(self,left,right):
if left == None and right !=None:return False
elif left != None and right == None:return False
elif left == None and right == None:return True
elif left.val != right.val:return False
outside = self.compare(left.left,right.right)
inside = self.compare(left.right,right.left)
issame = outside and inside
return issame
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
if not root:
return True
else:
return self.compare(root.left,root.right)
②迭代法:(注意不是层序遍历)
# 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 compare(self,left,right):
if left == None and right !=None:return False
elif left != None and right == None:return False
elif left == None and right == None:return True
elif left.val != right.val:return False
outside = self.compare(left.left,right.right)
inside = self.compare(left.right,right.left)
issame = outside and inside
return issame'''
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
if not root:
return True
queue = collections.deque()
queue.append(root.left)
queue.append(root.right)
while queue:
left1 = queue.popleft()
right1 = queue.popleft()
if not left1 and not right1:
continue
if not left1 or not right1 or left1.val!=right1.val:
return False
queue.append(left1.left)
queue.append(right1.right)
queue.append(left1.right)
queue.append(right1.left)
return True
2.leetcode题目 100 相同的树(easy):
①递归法:
# 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 compare(self,node1,node2):
if node1 == None and node2 == None:return True
elif node1 == None or node2 == None or node1.val!= node2.val:return False
#elif node1.val == node2.val:return True
left_ = self.compare(node1.left,node2.left)
right_ = self.compare(node1.right,node2.right)
issame = left_ and right_
return issame
def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
if not p and not q:
return True
else:
return self.compare(p,q)
②迭代法:
# 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 compare(self,node1,node2):
if node1 == None and node2 == None:return True
elif node1 == None or node2 == None or node1.val!= node2.val:return False
left_ = self.compare(node1.left,node2.left)
right_ = self.compare(node1.right,node2.right)
issame = left_ and right_
return issame'''
def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
if not p and not q:
return True
queue = collections.deque()
queue.append(p)
queue.append(q)
while queue:
node1 = queue.popleft()
node2 = queue.popleft()
if node1 == None and node2 == None:continue
if node1 == None or node2 == None or node1.val!= node2.val:return False
queue.append(node1.left)
queue.append(node2.left)
queue.append(node1.right)
queue.append(node2.right)
return True
3.leetcode题目 572 另一颗树的子树(easy):
双重递归:
# 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 isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
if not root:
return False
return self.isSametree(root,subRoot) or self.isSubtree(root.left,subRoot) or self.isSubtree(root.right,subRoot)
def isSametree(self,node1,node2):
if not node1 and not node2:
return True
if not node1 or not node2:
return False
return node1.val== node2.val and self.isSametree(node1.left,node2.left) and self.isSametree(node1.right,node2.right)