代码随想录算法训练营第十四天 | 226.翻转二叉树 101.对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度(先掌握递归法)

226.翻转二叉树

题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

解题:

思路:遍历的过程中交换每个节点的左右孩子。
选择哪种遍历方式?
中序不行,左中右,左边子节点交换完,处理中间交换了左节点和右节点,再处理右节点去交换时这个右节点就是原来的左节点,所以有一边就一直没处理。

点击查看代码
# 前序
class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root:
            return None
        root.left,root.right=root.right,root.left
        self.invertTree(root.left)
        self.invertTree(root.right)
        return root

101.对称二叉树
题目:给你一个二叉树的根节点 root , 检查它是否轴对称。

解题:

思路:只能用后序,因为要先比较左子树和右子树是否可以翻转的信息再返回给上一层。
如何判断能否翻转?
1.先排除左右节点包含空节点情况,一边空的肯定不行,两边空的肯定行;
2.再排除左右节点值不同的情况肯定不行;
3.然后开始比较下一层:后序,先判断外层,再判断内层,最后中间逻辑处理(是否相等)告诉父节点;
关键:递归到最底层才开始一层一层返回值。相当于是先一层层处理,然后能进入到最后层,并且判断也是True,就把这个值返回到出最初的root比较。

点击查看代码
class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        return self.compare(root.left, root.right)
        
    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

104.二叉树的最大深度

题目:给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

解题:

思路:根节点的高度就是二叉树的最大深度,所以这里用的是后序。
二叉树节点的深度:离根节点的距离,和正常递归顺序一样,从上往下计数,逐层加一。这里用前序,每到下一层先加一。
二叉树节点的高度:离叶子节点的距离,就要从下往上计数了。这种情况用后序,知道子节点高度后返回给父节点加一。
说明: 叶子节点是指没有子节点的节点。

点击查看代码
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        leftheight=self.maxDepth(root.left)
        rightheight=self.maxDepth(root.right)
        height=1+max(leftheight,rightheight)
        return height
        

111.二叉树的最小深度

题目:给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。

解题:

思路:同最大深度选择后序。
误区:

因此要加上一段代码:如果一边子树为空另一边不为空,直接返回不为空字数的高度加一。

点击查看代码
class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0 #终止条件
        leftDepth=self.minDepth(root.left)
        rightDepth=self.minDepth(root.right)
        if root.left is None and root.right is not None:
            return 1+rightDepth
        if root.left is not None and root.right is None:
            return 1+leftDepth
        height=1+min(leftDepth,rightDepth)
        return height

心得:
二叉树题目关键考虑选择哪种遍历方式
class类里面调用def函数要前面写上self
看最后要返回什么值,根节点,判断对错bool值,最大高度数值。。
递归三部曲:1.确定递归函数的参数和返回值(根节点,判断对错bool值,最大高度数值);2.确定终止条件;3.确定单层递归的逻辑
额外:先判断根节点为空的情况;

posted @ 2024-06-21 23:45  Y荷兰豆Y  阅读(8)  评论(0编辑  收藏  举报