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

题目链接:226. 翻转二叉树 - 力扣(LeetCode)

思路:通过先序遍历根左右,每次遍历到root 都转换root.left 和 root.right,然后再继续遍历下一个root

 递归思路:

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:

        def invertTree(root):
            if root == None:
                return

            root.left, root.right = root.right, root.left
            invertTree(root.left)
            invertTree(root.right)

            return root

        invertTree(root)
        return root

统一迭代:

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        
        if root == None:
            return root

        help_stack = []

        help_stack.append(root)

        while len(help_stack) > 0:

            current = help_stack[-1]

            if current != None:
                help_stack.append(None)
                if current.left != None:
                    help_stack.append(current.left)
                if current.right != None:
                    help_stack.append(current.right)

            else:
                help_stack.pop()
                current = help_stack.pop()
                current.left, current.right = current.right, current.left

        return root

题目链接:101. 对称二叉树 - 力扣(LeetCode)

思路:以中心为轴两边镜面对称,判断是否镜面对称,本质就是树的遍历

递归思路:

class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:

        def judgeSymmetric(left, right) -> bool:

            if left == None and right ==None:
                return True
            if left == None and right != None:
                return False
            if left != None and right == None:
                return False
            if left.val != right.val:
                return False                
            
            leftJudge = judgeSymmetric(left.left, right.right)
            rightJudge = judgeSymmetric(left.right, right.left)

            return leftJudge and rightJudge

        return judgeSymmetric(root.left, root.right)

统一迭代:

class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:


        help_deque = deque()

        help_deque.append(root.left)
        help_deque.append(root.right)

        while len(help_deque) > 0:
            left = help_deque.popleft()
            right = help_deque.popleft()

            if left == None and right == None:
                continue
            
            if (left != None and right == None) or (left == None and right != None) or (left.val != right.val):
                return False

            help_deque.append(left.left)
            help_deque.append(right.right)
            help_deque.append(left.right)
            help_deque.append(right.left)

        return True

 

题目链接:104. 二叉树的最大深度 - 力扣(LeetCode)

思路:迭代法-->层序遍历 遍历到第几层就是多深;递归法--> 根节点的高度是指根节点到叶子节点的最长简单路径的条数或节点数,所以可以用后序遍历来求解

迭代法:

class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if root == None:
            return 0

        help_deque = deque()
        help_deque.append(root)
        result = 0

        while len(help_deque) > 0:
            
            result += 1

            length = len(help_deque)

            for i in range(length):
                cur = help_deque.popleft()
                
                if cur.left != None:
                    help_deque.append(cur.left)

                if cur.right != None:
                    help_deque.append(cur.right)
        return result

递归法:

class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if root == None:
            return 0

        def getResult(root) -> int:
            if root == None:
                return 0

            leftDepth = getResult(root.left)
            rightDepth = getResult(root.right)
            return 1 + max(leftDepth, rightDepth)

        return getResult(root)

题目链接:111. 二叉树的最小深度 - 力扣(LeetCode)

思路:同样是层序遍历 不同的是,遍历到叶子节点时就可以跳出循环了,因为叶子节点就是最小深度;递归法基本思路与最大深度相同,需要注意的是最小深度是根节点到叶子节点的距离,所以要考虑根节点如果左子树是空的情况

迭代法:

class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if root == None:
            return 0

        help_deque = deque()
        help_deque.append(root)

        depth = 0

        while len(help_deque) > 0:
            
            depth += 1

            length = len(help_deque)

            for i in range(length):
                cur = help_deque.popleft()
                
                if cur.left != None:
                    help_deque.append(cur.left)

                if cur.right != None:
                    help_deque.append(cur.right)

                if cur.left == None and cur.right == None:
                    return depth

        return depth

递归法:

class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if root == None:
            return 0

        def getResult(root) -> int:
            if root.left == None and root.right == None:
                return 0
            leftDepth = sys.maxsize
            rightDepth = sys.maxsize
            if root.left != None:
                leftDepth = getResult(root.left)
            if root.right != None:
                rightDepth = getResult(root.right)
            return 1 + min(leftDepth, rightDepth)

        return getResult(root) + 1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值