真心求大家关注和点赞,原创不易,你们的支持是我写作的最大动力!
题目描述
给你一个二叉树和两个整数(val、depth),在给定的深度(depth)添加一行值为 val 的节点(根节点的深度为 1)
具体添加规则如下:
对于每个深度为 depth-1 的非空节点 k,创建两个子节点 left 和 right,子节点的值都为 val, left 和 right 分别作为 k 的左右子树,k 原来的左孩子作为 left 的左孩子,原来的右孩子作为 right 的右孩子。如果 depth === 1,那么 depth-1 === 0,因为没有深度为 0 的节点,所以先创建一个值为 val 的节点,作为新树的根节点,然后把原来的树整体作为它的左子树。
例一:
输入: root = [4,2,6,3,1,5], val = 1, depth = 2
输出: [4,1,1,2,null,null,6,3,1,5]
解释:depth-1 = 1, 对于第一层的每个节点,创建了以 val 为值的两个节点当做它的左右孩子,节点原来的左孩子变成了新插入左子树的左孩子,原来的右孩子变成了新插入右子树的右孩子
例二:
输入: root = [4,2,null,3,1], val = 1, depth = 3
输出: [4,2,null,1,1,3,null,null,1]
思路分析
这道题和 Average of Levels in Binary Tree 很像,都是对树的遍历,确定深度后进行处理。
按照惯例,先列出解题前需要搞清楚的几个问题:
- 二叉树的遍历
- 如何知道当前遍历的节点在哪一层
- 如何修改子树的关系
- 当传入 depth === 1 时的特殊处理
问题一和二之前已经说过了,问题三应该也不难,节点初始化的代码如下:
function TreeNode(val, left, right) {
this.val = val === undefined ? 0 : val;
this.left = left === undefined ? null : left;
this.right = right === undefined ? null : right;
}
初始化节点需要传入当前节点值、左孩子和右孩子
那么我们在创建节点时可以用 val 当做节点的值,以原节点的左孩子作为当前创建节点的左孩子,右孩子可以传入 undefined 表示为空,节点创建好后赋值给原节点的 left;用同样的方法可以处理右孩子。
对于问题四,我们可以单独判断进行处理,当发现传入的 depth 为 1 时,直接返回一个以原节点根节点为左孩子的节点。
AC 代码
var addOneRow = function (root, v, d) {
if (d === 1) {
return new TreeNode(v, root, undefined);
}
const preOrder = (node, depth) => {
if (node) {
if (depth === d - 1) {
node.left = new TreeNode(v, node.left, undefined);
node.right = new TreeNode(v, undefined, node.right);
return;
}
preOrder(node.left, depth + 1);
preOrder(node.right, depth + 1);
}
};
preOrder(root, 1);
return root;
};
总结
这道题考察的还是对树的遍历,难度不大,在掌握遍历的基础上进行操作。可以和 Average of Levels in Binary Tree 进行对比,不难发现这类题的套路和通用解法。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情