[LeetCode:Add One Row to Tree] | 刷题打卡

264 阅读3分钟

真心求大家关注和点赞,原创不易,你们的支持是我写作的最大动力!

题目描述

给你一个二叉树和两个整数(val、depth),在给定的深度(depth)添加一行值为 val 的节点(根节点的深度为 1)

具体添加规则如下:

对于每个深度为 depth-1 的非空节点 k,创建两个子节点 left 和 right,子节点的值都为 val, left 和 right 分别作为 k 的左右子树,k 原来的左孩子作为 left 的左孩子,原来的右孩子作为 right 的右孩子。如果 depth === 1,那么 depth-1 === 0,因为没有深度为 0 的节点,所以先创建一个值为 val 的节点,作为新树的根节点,然后把原来的树整体作为它的左子树。

例一:

add1-tree.jpg

输入: 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 为值的两个节点当做它的左右孩子,节点原来的左孩子变成了新插入左子树的左孩子,原来的右孩子变成了新插入右子树的右孩子

例二:

add2-tree.jpg

输入: 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 很像,都是对树的遍历,确定深度后进行处理。

按照惯例,先列出解题前需要搞清楚的几个问题:

  1. 二叉树的遍历
  2. 如何知道当前遍历的节点在哪一层
  3. 如何修改子树的关系
  4. 当传入 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 春招闯关活动」, 点击查看 活动详情