持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
以前写算法都是,看了讲解写完了就over了,今天翻出来以前通过的一些题,发现又绷住了,真的得好好记录一下
- 对称二叉树
这道题要查看给定的二叉树,是否轴对称。
解析:想要看是否轴对称
- 从根节点开始,如果只有2层
[1,2,2]那只需要比较两个子节点相同即可 - 但如果有多层节点的话,就需要比较两个子节点是否是镜像的,比较的是对称过位置的值。
- 入上图,需要比较 两颗子树外侧和内侧的节点是否相同。
- 如果我们定义一个
compare()那么外侧比较的参数应该是root.left.left和left.right.right;内测比较的参数应该是root.left.right和root.right.left - 再加入递归的思想,递归比较每个节点镜像位置的值。
代码如下:
- 二叉树的最大深度
这道题要查询 根节点到最远叶子节点的最长路径上的节点数 也就是最大深度。
- 思路就是通过递归的遍历左右子树,从下到上,不断地筛选出更深的子树。
- 递归的终止条件是遇到了null节点,然后返回 0
- 由 null 节点的父节点来判断 左右子节点的深度大小, 并再向上返回更深的节点。直到根节点
- 二叉树的最小深度
这道题和上面那道相似,但是又不完全一样。
需要考虑的是 找到最近的而叶子节点的深度,这个要求在最深中不需要太多考虑。但在最浅这里需要考虑
也就是当 某个节点的左子树存在但右子树不存在时,这个右子树不能返回0
- 合并二叉树
这道题也是比较简单的。唯一不熟悉的可能就是需要同时传入两个二叉树进行递归
- 考虑可能会出现的几种情况
- 参数节(相同位置的节点)点都存在,就将该位置上的val相加
- 参数节点一个存在,一个不存在。就把存在的那个节点也赋值给不存在的,并不再往下递归
- 两个节点都不存在, 返回null
- 递归的过程相当于,用深度优先遍历 同时遍历两个树。
简化一下代码
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);
};
\