二叉树

134 阅读2分钟

104. 二叉树的最大深度

给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回它的最大深度 3

思路:深度优先搜索,获取左子树的最大深度和右子树的最大深度,它们中的最大值+1,就是树的最大深度

function maxDepth(root) {
  return dfs(root)
}

function dfs(root) {
  if(root == null) return 0;
  let leftDepth = dfs(root.left);
  let rightDepth = dfs(root.right);
  return Math.max(leftDepth, rightDepth) + 1
}

image.png 说说我的递归思路:把问题拆分为几个假设已经完成的小问题,再加上临界条件,就可以完成递归了

例如上面,我们把树的最大深度拆解为左子树或右子树的最大深度+1

假设子问题已经解决,那么左子树的最大深度就是dfs(root.left),
不要去想它下面是怎么走的,否则太费脑子
右子树的最大深度就是dfs(root.right),然后就是返回它们俩的最大值+1.
最后就是结束条件,显然是当root为null,也就是下面没有节点了,直接就返回0


时间复杂度:每个节点都要遍历一次,所以就是O(n) 空间复杂度: 取决于树的深度,每一层需要保存一个递归函数上下文在执行栈中

101. 对称二叉树

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3

按照上面递归的思路: 检查二叉树是否是镜像对称,就是检查左右子树是否相等
左右子树是否相等就是

  • 左子树值是否存在且等于右子树的值
  • 左子树的左子树值是否等于右子树的右子树值
  • 左子树的右子树值是否等于右子树的左子树值 说人话就是,3是否对于对面的3,4是否等于对面的4
function isSymmetric(root) {
   if(root == null) return false // 空树
   return dfs(root.left, root.right) // 左右子树是否相等
}

function dfs(left, right) {
    if(left == null && right == null) return true // 两个都为空,是对称的
    if(left == null || right == null) return false // 只有一个是空,不对称
    if(left.val !== right.val) return false // 值不相等,不对称
    // 上面就是判断左子树值是否等于右子树的值
    
    // 假设子问题已经解决,判断它们的子树是否对称
    return dfs(left.left, right.right) && dfs(left.right, right.left)
}