两种典型的递归方法解决树的遍历问题

  • 二叉树的最大深度

描述:给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
在这里插入图片描述

递归法(自顶向下)

通过递归法,左右子树同时向下递归遍历,直到遍历到最后节点,累计节点深度。返回累计的左右子树最大的深度+1,加1是为了把根节点计算进去。

class Solution:
	def maxDepth(self,root:Optional(TreeNode))->TreeNode:
		if not root:
			return 0
		# 左子树的深度
		left_dep=self.maxDepth(root.left)
		# 右子树的深度
		right_dep=self.maxDepth(root.right)
		return max(left_dep,right_dep)+1
  • 对称二叉树

描述:给你一个二叉树的根节点 root , 检查它是否轴对称。
在这里插入图片描述

1. 递归法(自顶向下)

该方法通过“自顶向下”的递归方案执行,根据对称二叉树的定义,对于树中任意两个对称节点L和R,一定有:

  • L.val = R.val,即两对称节点值相等;
  • L的左子节点的值等于R的右子节点的值相等;
  • L的右子节点的值等于R的左子节点的值相等;
    在代码实现的过程中,要注意递归的结束条件,首先是左右节点都为空,返回True。然后左节点或右节点为空,或左右节点值不相等,返回False。
    在这里插入图片描述
    ps:图片源自leetcode
class Solution:
	def isSymmetric(self,root:Optional[TreeNode])->bool:
		def recur(L,R):
			if not L and not R:
				return True
			if not L or not R or L.val!=R.val:
				return False
			return recur(L.left,R.right) and recur(L.right,R.left)
		return not root or recur(root.left,root.right) 

在这里插入图片描述

2. 迭代法

迭代法通常使用队列或栈来存储需要处理的节点,对于轴对称二叉树的检查,我们可以使用一个队列来存储需要比较的节点对。每一对节点应该满足镜像对称的条件。
我们从根节点的左子节点和右子节点开始,将它们作为一对节点加入队列。然后,我们不断从队列中取出节点对,并检查它们是否满足镜像对称的条件。如果满足,我们将它们的左子节点和右子节点(如果存在)作为新的节点对加入队列。如果任何时候发现不满足条件的节点对,我们就返回 False。如果队列为空时都没有发现不满足条件的节点对,我们就返回 True。

# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        # 使用 deque(双端队列)来初始化一个队列,并将根节点的左子节点和右子节点作为一对加入队列。
        queue = deque([(root.left,root.right)])
        # 遍历队列
        while queue:
            # 从队列的左侧取出一个节点对(左子节点和右子节点)
            left,right=queue.popleft()
            # 如果当前取出的左子节点和右子节点都是空的,说明当前这一层已经对称
            if not left and not right:
                continue
            
            if not left or not right or left.val!=right.val:
                return False
            # 左子树左子节点和右子树右子节点作为一对加入队列,节点为空也会加入到队列
            queue.append((left.left,right.right))
            # 左子树右子节点和右子树左子节点作为一对加入队列,节点为空也会加入到队列
            queue.append((left.right,right.left))
        return True

在这里插入图片描述

相关推荐

  1. 二叉方式

    2024-03-20 20:52:02       16 阅读
  2. leetcode中二叉方式实现

    2024-03-20 20:52:02       32 阅读
  3. 解决问题方法

    2024-03-20 20:52:02       46 阅读
  4. 二叉(法)

    2024-03-20 20:52:02       32 阅读
  5. 前序思路

    2024-03-20 20:52:02       14 阅读
  6. 解决深度

    2024-03-20 20:52:02       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-20 20:52:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-20 20:52:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-20 20:52:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-20 20:52:02       20 阅读

热门阅读

  1. Leetcode 239 滑动窗口最大值

    2024-03-20 20:52:02       22 阅读
  2. 动态加载CSS文件

    2024-03-20 20:52:02       18 阅读
  3. 如何从零开始拆解uni-app开发的vue项目(二)

    2024-03-20 20:52:02       19 阅读
  4. Python 中可以用来生成 SVG 图的库

    2024-03-20 20:52:02       22 阅读
  5. linux系统中的PS命令详解

    2024-03-20 20:52:02       22 阅读
  6. 主流开发语言和开发环境介绍

    2024-03-20 20:52:02       23 阅读
  7. DNS劫持怎么预防?

    2024-03-20 20:52:02       24 阅读
  8. 去除项目git的控制 端口号的关闭

    2024-03-20 20:52:02       22 阅读
  9. 对建造者模式的理解

    2024-03-20 20:52:02       19 阅读
  10. 《建造者模式(极简c++)》

    2024-03-20 20:52:02       24 阅读
  11. Doris案例篇—美团外卖数仓中的应用实践

    2024-03-20 20:52:02       20 阅读