代码随想录训练营第14天 || 1.翻转二叉树 2.对称二叉树 3.二叉树的最大深度 4.二叉树的最小深度

翻转二叉树:

讲解:代码随想录

思路:

递归法:通过递归交换结点的左右字结点,中止条件:结点为空 ,采用的前序遍历,最好采用前序和后序遍历,因为中序遍历会比较绕。

代码:

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root:
            return root#这个return root是中止中间inverttree函数的操作
        root.left,root.right=root.right,root.left
        self.invertTree(root.left)
        self.invertTree(root.right)
        return root#此处是中止整个invertTree的操作

遇到的问题:

1.对于每个return 的作用

对称二叉树

讲解:代码随想录

思路:

递归法:使用递归判断数的内侧和外侧是否相同,比较函数传入根节点的两个子树对称的结点,进行判断,直到到达出现空结点时,意味着到达了两端树其中一端或者两端的尽头,此时开始回溯

代码:

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 True
        elif left == None and right!=None:
            return  False
        elif left !=None and right == None:
            return False
        elif left.val !=right.val:#此时比较值,是在结点都不为空的基础上存在的
            return False
        
        outside = self.compare(left.left,right.right)
        inside = self.compare(left.right,right.left)
        res = outside and inside
        return res

遇到的问题:

1.对于是否对称的判断条件:一边为空一边不为空,那么不对称,两边为空为对称,此时到达树的结尾开始递归中的归,还有一种结点都存在,且值相等,此时还未到达树的结尾,继续向内递进

二叉树的最大深度

代码随想录

思路:

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)

求二叉树的深度一般使用前序遍历,求二叉树高度一般用后序遍历,但此题二叉树最大深度等于二叉树最大高度,所以优先用简单的后序遍历

使用递归法

代码:

class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        #采用后序遍历,因为最大深度等于最大高度
        leftlight = self.maxDepth(root.left)
        rightlight = self.maxDepth(root.right)
        light = max(leftlight,rightlight)+1
        return light

遇到的问题:

1.对于叶子结点的理解

2.对于前序遍历的理解(先放过,等回溯再看)

二叉树的最小深度:

讲解:代码随想录

思路:

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)

求二叉树的深度一般使用前序遍历,求二叉树高度一般用后序遍历,但此题二叉树最小深度等于二叉树最小高度,所以优先用简单的后序遍历

使用递归法

代码:

递归法

class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        leftlight = self.minDepth(root.left)
        rightlight = self.minDepth(root.right)
        #问题一
        if  root.left  and not root.right :#
            return leftlight+1
        if  root.left ==None and root.right !=None :
            return rightlight+1
        light = min(leftlight,rightlight)+1
        return light

遇到的问题:

1.问题一(对应代码中):对于递归中归的操作时,因为求的是最小深度,是根结点到叶子结点的距离,所以在最底部要判断是否为叶子结点,在中途要注意区别缺一个子结点的情况,总的来说就是当只有一个子节点时,如何判断结点对于最小深度的贡献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值