树相关算法记录

54 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

以前写算法都是,看了讲解写完了就over了,今天翻出来以前通过的一些题,发现又绷住了,真的得好好记录一下

  1. 对称二叉树

image-20221006152409741

这道题要查看给定的二叉树,是否轴对称。

解析:想要看是否轴对称

  • 从根节点开始,如果只有2层 [1,2,2]那只需要比较两个子节点相同即可
  • 但如果有多层节点的话,就需要比较两个子节点是否是镜像的,比较的是对称过位置的值。
  • 入上图,需要比较 两颗子树外侧和内侧的节点是否相同。
  • 如果我们定义一个 compare()那么外侧比较的参数应该是 root.left.leftleft.right.right;内测比较的参数应该是root.left.rightroot.right.left
  • 再加入递归的思想,递归比较每个节点镜像位置的值。

代码如下:

image-20221006153809738

  1. 二叉树的最大深度

image-20221006160018186

这道题要查询 根节点到最远叶子节点的最长路径上的节点数 也就是最大深度。

  • 思路就是通过递归的遍历左右子树,从下到上,不断地筛选出更深的子树。
  • 递归的终止条件是遇到了null节点,然后返回 0
  • 由 null 节点的父节点来判断 左右子节点的深度大小, 并再向上返回更深的节点。直到根节点

img

image-20221006161041002

  1. 二叉树的最小深度

image-20221006163155722

这道题和上面那道相似,但是又不完全一样。

需要考虑的是 找到最近的而叶子节点的深度,这个要求在最深中不需要太多考虑。但在最浅这里需要考虑

也就是当 某个节点的左子树存在但右子树不存在时,这个右子树不能返回0

image-20221006163822413

  1. 合并二叉树

这道题也是比较简单的。唯一不熟悉的可能就是需要同时传入两个二叉树进行递归

  • 考虑可能会出现的几种情况
  • 参数节(相同位置的节点)点都存在,就将该位置上的val相加
  • 参数节点一个存在,一个不存在。就把存在的那个节点也赋值给不存在的,并不再往下递归
  • 两个节点都不存在, 返回null
  • 递归的过程相当于,用深度优先遍历 同时遍历两个树。

image-20221006191434012

简化一下代码

var mergeTrees = function (root1, root2) {
    const preOrder = (root1, root2) => {
        if (!root1)
            return root2
        if (!root2)
            return root1;
        root1.val += root2.val;
        root1.left = preOrder(root1.left, root2.left);
        root1.right = preOrder(root1.right, root2.right);
        return root1;
    }
    return preOrder(root1, root2);
};

\