讲真,递归一直是我的噩梦,今天就来看看自己的软肋能不能说得清楚吧哈哈哈。
104,二叉树的最大深度
递归过程包含3个要素:1.边界条件,2.非边界条件 3.子问题拆分。
首先是边界条件最大二叉树的深度,到叶子节点的左右肯定是0,因为它是空结点。好那我们看看边界条件,边界条件就是最后一步需要返回什么,也就是到边界了该返回什么这里来说就是返回0,下一步,我们需要看看子问题怎么去拆分,找子树深度我们需要去遍历整个树,所以这里的递归就循环调用当前的方法也就是self.方法,通过不断把左右子树放入然后返回去完全遍历树。这里的返回值就是左右子树中比较深的那一棵子树的深度+1.
下面是代码
python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
if root ==None:
return 0
else:
l_val = self.maxDepth(root.left)
r_val = self.maxDepth(root.right)
return max(l_val , r_val) + 1
100,相同的树
讲真其实这道题让我自己写还是很想,他的边界条件是左右树遍历节点遍历到为空的时候是否都为空,如果是都是空就返回1,否则就返回0。然后非边界的条件就是当前的值都相等的话返回一个1不然就返回0,一样的需要分为左右子树不同地去做推理判断。
然后代码确实太简单了,简单到emm我有点感觉自己的智慧不能驾驭哈哈哈。
就是先来个边界条件,然后返回值设置成3个判断。其中有两个是递归判断
python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
if p is None or q is None:
return p is q
return p.val == q.val and self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)
101.对称二叉树
这一题其实跟上一题判断是否为相同的子树是一样的,只是我们的条件需要去做一下更换,对称的二叉树,需要对比的是左树的左树跟右树的右树,有点绕口不过确实就是这样的。下面是代码
用到了上一题的判断两个树是否相等的递归代码
python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def issametree(self, p, q):
if p is None or q is None:
return p is q
return p.val == q.val and self.issametree(p.left,q.right) and self.issametree(p.right,q.left)
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
l = root.left
r = root.right
return self.issametree(l,r)
110.平衡二叉树
这道题有点意思,这道题是求取树的深度的plus版本,这里我们的解法也是比较有意思。我们需要设置一个判定返回值-1作为我们判断树不平衡的一个指标。如果返回值为-1那树就不平衡,反之返回最大的深度的信息。那什么时候返回-1呢?第一种情况是收到的值为-1了那就直接走快速路返回-1,否则进行下一步,第二种情况是新碰到-1了,就是左右子树的差绝对值大于1,这种情况我们需要去返回-1.最后把结果返回。在主函数中调用高度函数,塞入初始节点即可
python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isBalanced(self, root: Optional[TreeNode]) -> bool:
def get_height(node):
if node ==None:
return 0
l_val = get_height(node.left)
if l_val == -1:
return -1
r_val = get_height(node.right)
if r_val == -1:
return -1
if abs(l_val - r_val)>1:
return -1
return max(l_val,r_val) + 1
return get_height(root) is not -1
199.二叉树的右视图
这一题很有意思,需要我们拿取右边的所有元素,我们具体怎么实现呢?首先我们需要制造一个函数,可以传递层数与深度,然后我们根据不同的深度去做判断与递归。当深度满足时append新元素。具体看下面代码吧,有点困了,回宿舍看我是大哥大去了,晚安各位
python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
ans = []
def f(node, depth):
if node is None:
return
if depth == len(ans):
ans.append(node.val)
f(node.right,depth+1)
f(node.left ,depth+1)
f(root,0)
return ans