LeetCode (python实现) —— 树

这篇博客详细介绍了LeetCode中关于二叉树和树形结构的问题,涵盖最大深度、最小深度、对称性检查、翻转、路径和等挑战,包括简单的递归和非递归解决方案。博主分享了学习二叉树问题的心得,旨在加深对递归的理解,同时提供了多道题目解题思路和代码实现。

O:前言

关于二叉树的题,大部分都是用递归实现的,代码量少,思路清晰,当然会存在递归深度过深而导致的时间损耗或重复计算等问题,关于二叉树的题,可以加深我们对递归的理解。我也会尝试用非递归代码实现,其中有些题是我copy他人优秀解答代码的,希望理解,能力有限,大家共同学习,共同进步!

一. 难度:简单

1.1 二叉树

104:二叉树的最大深度
  • 题目描述
    给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
    说明: 叶子节点是指没有子节点的节点。
  • 例子
    给定二叉树 [3,9,20,null,null,15,7]

   3
  /   \
 9    20
   /   \
   15   7

返回它的最大深度3

  • 递归实现
class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if not root:
            return 0
        return 1 + max(self.maxDepth(root.left), self.maxDepth(root.right))
  • 非递归实现(深度优先搜索)
class Solution:
    def maxDepth(self, root: TreeNode) -> int:
    	if not root:
    		return 0
    	self.max_d = 0
    	self.dfs(root,0) 
		return self.max_d

    def dfs(self, node: TreeNode, level: int) -> int:
    	if not node:
            if self.ans < level:
                self.ans = level
            return
    	self.dfs(node.left,level+1)
    	self.dfs(node.right,level+1)
111. 二叉树的最小深度
  • 题目描述
    给定一个二叉树,找出其最小深度。
    最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
    说明: 叶子节点是指没有子节点的节点。
  • 例子
    给定二叉树 [3,9,20,null,null,15,7]

   3
  /   \
 9    20
   /   \
   15   7

返回它的最小深度2

  • 递归实现
class Solution:
    def minDepth(self, root: TreeNode) -> int:
    	if root:
    		if root.left and root.right:
    			return 1+min(self.minDepth(root.left),self.minDepth(root.right))
    		elif root.left:
    			return 1+self.minDepth(root.left)
    		elif root.right:
                return 1+self.minDepth(root.right)
            else:
                return 1
        else:
        	return 0
  • 非递归实现(深度优先搜索)
class Solution:
    def minDepth(self, root: TreeNode) -> int:
        if root == None:
            return 0
        self.ans = float("inf")
        self._dfs(root, 0)
        return self.ans
        
    def _dfs(self, node, level):
        if node == None:
            return
        if node.left == None and node.right == None:
            if self.ans > level+1:
                self.ans = level + 1
            return
        self._dfs(node.left, level + 1)
        self._dfs(node.right, level + 1)
101. 对称二叉树
  • 题目描述
    给定一个二叉树,检查它是否是镜像对称的。
    例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

     1
   /    \
  2     2
 /   \     /   \
3   4  4   3

但是下面这个[1,2,2,null,3,null,3],则不是对称的

     1
   /    \
  2     2
    \        \
   3      3

  • 层次遍历
class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        # 检查每一层是否是回文
        queue = [root]
        while queue != []:
            next_queue,each_layer = [],[]
            for node in queue:
                if node == None:
                    each_layer.append(None)
                    continue
                next_queue.append(node.left)
                next_queue.append(node.right)
                each_layer.append(node.val)
            if each_layer != each_layer[::-1]:
                return False
            queue = next_queue
        return 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值