leetcode算法训练十三天| 102.二叉树的层序遍历,226.反转二叉树,101.对称二叉树

最近特别忙(准备实习的各种面试+实习笔试+学院评比答辩+课程结课展示,而且今天下午的风控建模面试八成是g了,谁能想到考八股文啊。。。救命啊啊啊啊啊,已经拉下一天了,尽快补上!!!),故层序遍历先做一道最基础的题目以记忆下二叉树层序遍历的方法。记录下今天跑40km只为参加一个实习面试。。。

102.二叉树的层序遍历

学习视频:讲透二叉树的层序遍历 | 广度优先搜索 | LeetCode:102.二叉树的层序遍历_哔哩哔哩_bilibili

学习文档:代码随想录 (programmercarl.com)

学习时间:20:00-20:40

记录时间:20:40-21:10

状态:已听懂|可单独复写代码|暂不需复习

1. 看到问题后的初始想法与看完随想录后的心得

        第一眼看到这个题目我的反应是给每个节点标记序号,每一层为一个序号,然后往下做。但是显然我们有更巧妙的方法来解决这些题目。本题可以使用队列来记录每一层的数据(没错,又是队列,而且每一次队列都用的非常巧妙)其大致思路为,初始化队列,先把root推进队列中。然后开始while循环,终止条件为队列为空,接下来记录队列的size,size表达一层节点的数量(如果有点迷糊可以看下面的代码)。根据size的大小遍历队列,在遍历过程中,队列popleft得到该层某个元素,还需要判断该元素是否有左右节点,如果有需要再将其加入队列中。代码如下:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
import collections

class Solution(object):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if root is None:
            return []
        results = []
        queue = collections.deque([root])
        while queue:
            size = len(queue)
            result = []
            for _ in range(size):
                node = queue.popleft()
                result.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            results.append(result)
        return results
        

226. 反转二叉树

学习视频:听说一位巨佬面Google被拒了,因为没写出翻转二叉树 | LeetCode:226.翻转二叉树_哔哩哔哩_bilibili

学习文档:代码随想录 (programmercarl.com)

学习时间:21:20-21:45

记录时间:21:45-22:00

状态:已听懂|可单独复写代码|暂不需复习

1. 看到问题后的初始想法与看完随想录后的心得        

        由于时间问题直接看的卡哥思路,并没有自己思考。同样,这是一道递归的题目,我们就要判定确认递归的三个条件。

        都一个是递归输入输出,这题递归的输入有我们需要接下来遍历寻找的节点,输出可以没有,仅仅改变root的指针方向,也可以最后输出root。

        第二个是递归终止条件,当我们递归到空节点上时,我们就停止遍历并返回那个空节点。

        第三个是每一层递归的处理过程,在这里我们可以先inverse左子树,再inverse右子树,最后把该节点出的左右子树交换(属于后序处理办法,当然前序也可以,但是如果是中序的话我们就需要进行一些改变)

代码如下:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        def inverse(root):
            if root is None:
                return root
            inverse(root.left)
            inverse(root.right)
            temp = root.left
            root.left = root.right
            root.right = temp
        inverse(root)
        return root
        

 101. 对称二叉树

学习视频:新学期要从学习二叉树开始! | LeetCode:101. 对称二叉树_哔哩哔哩_bilibili

学习文档:代码随想录 (programmercarl.com)

学习时间:9:10-9:50

记录时间:9:54-

状态:已听懂|可单独复写代码|需复习

 1. 看到问题后的初始想法与看完随想录后的心得

        由于之前没有做过对称二叉树的题目,根据随想录建议先看的视频再来做题目。同样,本题使用递归来解决问题。我们需要判断递归的三个条件。

        1. 递归函数的输入为root的左子树节点与右子树节点,输出为左右子树是否相等(bool值)

        2. 递归函数的终止条件有四个,当左子树的节点为空而右子树对应的节点不为空时返回False,当左子树的节点不为空而右子树对应的节点为空时返回True。当左右子树的节点都不为空但是数值不相等时返回False。当左右子树的节点均为空时返回True。

        3. 递归的每一层我们需要处理:判断该树的外侧是否相等(left.left and right.right)、内侧是否相等(left.right and right.left)并最后返回result。

代码如下:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        def symmetric(left, right):
            if left is None and right is not None:
                return False
            elif left is not None and right is None:
                return False
            elif left is None and right is None:
                return True
            elif left.val != right.val:
                return False
            outside = symmetric(left.left, right.right)
            inside = symmetric(left.right, right.left) 
            result = outside and inside
            return result
        return symmetric(root.left, root.right)       

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值