-
二叉树递归遍历
二叉树的一个重要思路就是递归!!!下面几题非常相似全都是递归!!
104. 二叉树的最大深度-简单
题目概述:二叉树求深度。
题目网址:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/
题目思路:二叉树的基本操作:递归。很多对二叉树的操作思路都很相似,属于最基本但是必须掌握的类型了。不要忘记输入节点是空的基本情况。
class Solution:
def maxDepth(self, root: TreeNode) -> int:
if not root:
return 0
return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1
543. 二叉树的直径-简单
题目概述:二叉树求最长路径。
题目网址:https://leetcode-cn.com/problems/diameter-of-binary-tree/
题目思路:主要思路相似要采用递归。但是,这个最长路径要么经过节点本身,要么不经过。因为可能答案不包括根节点,这种情况其实是不在递归求解里面的,所以要针对这个情况对递归作出调整。
如果不经过节点本身,那就是在左或者右子树中有最远路径,如果经过了节点本身其实就是左子树的深度加右子树的深度。所以可以偷懒的直接用求深度的函数加递归来做:
class Solution:
def diameterOfBinaryTree(self, root: TreeNode) -> int:
if not root:
return 0
def dep(r):
if not r:
return 0
return max(dep(r.left), dep(r.right)) + 1
return max(self.diameterOfBinaryTree(root.left), self.diameterOfBinaryTree(root.right), dep(root.left) + dep(root.right))
更普遍而且也更好的做法是使用一个全局变量ans进行记录,每次递归都返回包含根节点的情况,如果其中不包含根节点的答案更好就更新ans,否则就不更新。以此来求最长路径:
class Solution:
def diameterOfBinaryTree(self, root: TreeNode) -> int:
self.ans = 0
if not root:
return 0
def lr(rt):
if not rt:
return 0
l = lr(rt.left)
r = lr(rt.right)
self.ans = max(self.ans, l + r)
return max(l, r) + 1
lr(root)
return self.ans
124. 二叉树中的最大路径和-困难
题目概述:二叉树任意两节点的最大路径和,至少含一个节点。
题目网址:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/
题目思路:这题和上一题的思路简直一摸一样。唯一的区别是,这次节点含有负数,因此要考虑当子节点为负时要舍弃。
代码和上一题几乎一样,唯一要改的算式中是加节点值。然后要注意舍弃掉负节点。
class Solution:
def maxPathSum(self, root: TreeNode) -> int:
self.ans = root.val
if not root:
return 0
def lr(rt):
if not rt:
return 0
# 舍弃负节点
l = max(lr(rt.left), 0)
r = max(lr(rt.right), 0)
self.ans = max(self.ans, l + r + rt.val)
return max(l, r) + rt.val
lr(root)
return self.ans
687. 最长同值路径-简单
题目概述:二叉树所有节点值相等的最长路径。
题目网址:https://leetcode-cn.com/problems/longest-univalue-path/
题目思路:这题和543题的思路也是一摸一样。唯一的区别是,节点值要相等。
class Solution:
def longestUnivaluePath(self, root: TreeNode) -> int:
self.ans = 0
if not root:
return 0
def lr(rt):
if not rt:
return 0
l = lr(rt.left)
# 左右子节点如果和根节点树枝不一样置为0
if l != 0:
if rt.left.val != rt.val:
l = 0
r = lr(rt.right)
if r != 0:
if rt.right.val != rt.val:
r = 0
self.ans = max(self.ans, l + r)
return max(l, r) + 1
lr(root)
return self.ans