二叉树的最大深度和对称二叉树

  • 二叉树的最大深度

描述:给定一个二叉树 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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值