算法题day15(补5.5日卡)

一、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)

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值