这里写目录标题
- 一、104. 二叉树的最大深度
- 二、100. 相同的树
- 三、226. 翻转二叉树
- 四、101. 对称二叉树
一、104. 二叉树的最大深度
简单
给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
1、确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回这棵树的深度,所以返回值为int类型。
2、确定终止条件:如果为空节点的话,就返回0,表示高度为0。
3、确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。
class S104:def func(self, root):def dfs(root, depth):if not root: # 如果没有叶子节点返回深度return depthelse:return max(dfs(root.left, depth + 1), dfs(root.right, depth + 1))dfs(root, 0)
二、100. 相同的树
简单
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
1、确定递归函数的参数和返回值:参数就是传入两颗树,返回值为True或者False。
2、确定终止条件:
- 左节点为空,右节点不为空,return false
- 左不为空,右为空,return false
- 左右都为空,返回true。
- 左右节点都存在,判断左节点的值与右节点的值是否相等,如果不相等,返回False
3、确定单层递归的逻辑:p树的左子树,q树的左子树;p树的右子树,q树的右子树
class S100:def func(self, p, q):if not p and not q:return Trueif not p:return Falseif not q:return Falseif p.val != q.val:return Falsereturn self.func(p.left, q.left) and self.func(p.right, q.right)
三、226. 翻转二叉树
简单
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
递归三部曲:
1、确定递归函数的参数和返回值
参数就是要传入节点的指针,不需要其他参数了
2、确定终止条件
当前节点为空的时候,就返回
3、确定单层递归的逻辑
因为是先前序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。
class S226:def func(self, root):if not root:returnl = self.func(root.left)r = self.func(root.right)root.left = rroot.right = lreturn root
四、101. 对称二叉树
简单
给你一个二叉树的根节点 root , 检查它是否轴对称。
递归三部曲
1、确定递归函数的参数和返回值
因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。
2、确定终止条件
要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!否则后面比较数值的时候就会操作空指针了。
节点为空的情况有:
- 左节点为空,右节点不为空,不对称,return false
- 左不为空,右为空,不对称 return false
- 左右都为空,对称,返回true
此时已经排除掉了节点为空的情况,那么剩下的就是左右节点不为空:
左右都不为空,比较节点数值,不相同就return false
此时左右节点不为空,且数值也不相同的情况我们也处理了。
3、确定单层递归的逻辑
此时才进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。
比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
比较内侧是否对称,传入左节点的右孩子,右节点的左孩子。
如果左右都对称就返回true ,有一侧不对称就返回false 。
class S101:def func(self, root):def dfs(left, right):if not left and not right:return Trueelif not left and right:return Falseelif left and not right:return Falseelif left.val != right.val:return Falseelse:return dfs(left.left, right.right) and dfs(left.right, right.left)return dfs(root.left, root.right)