持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
🎈算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道中等难度的题目 -> 装饰树
题目描述
力扣嘉年华上的 DIY 手工展位准备了一棵缩小版的 二叉 装饰树 root 和灯饰,你需要将灯饰逐一插入装饰树中,要求如下:
-
完成装饰的二叉树根结点与
root的根结点值相同 -
若一个节点拥有父节点,则在该节点和他的父节点之间插入一个灯饰(即插入一个值为
-1的节点)。具体地:- 在一个 父节点 x 与其左子节点 y 之间添加 -1 节点, 节点 -1、节点 y 为各自父节点的左子节点,
- 在一个 父节点 x 与其右子节点 y 之间添加 -1 节点, 节点 -1、节点 y 为各自父节点的右子节点,
现给定二叉树的根节点 root ,请返回完成装饰后的树的根节点。
示例 1:
输入:
root = [7,5,6]输出:
[7,-1,-1,5,null,null,6]解释:如下图所示,
示例 2:
输入:
root = [3,1,7,3,8,null,4]输出:
[3,-1,-1,1,null,null,7,-1,-1,null,-1,3,null,null,8,null,4]解释:如下图所示
提示:
0 <= root.Val <= 1000
root节点数量范围为[1, 10^5]
思路分析
首先我们要先理解一下题目的意思,题目会给我们一个二叉树,现在我们需要装饰一下这棵二叉树,在每个父子节点中间加上值为'-1'的一个装饰节点,如例1,7有两个子节点,左节点为5,右节点为6,现在我们需要在节点5和节点7及节点6和节点7之间插入一个装饰节点,原本的左节点作为插入的装饰节点的左节点,右节点应为插入的装饰节点的右节点,知道了题意之后,我们会发现其实这是一道比较简单的二叉树遍历题目,我们可以这样做:
- 1、遍历二叉树
遍历二叉树的每一个节点
const dfs = (r)=>{
if(!r) return;
if(r.left){
dfs(r.left);
}
if(r.right){
dfs(r.right);
}
}
- 2、插入装饰节点
在遍历到的每一个非叶子节点的节点后面加上一个装饰节点,需要注意的是原本的左节点作为插入的装饰节点的左节点,右节点应为插入的装饰节点的右节点
const dfs = (r)=>{
if(!r) return;
if(r.left){
dfs(r.left);
const leftNode = new TreeNode(-1,r.left,null);
r.left = leftNode;
}
if(r.right){
dfs(r.right);
const rightNode = new TreeNode(-1,null,r.right);
r.right = rightNode;
}
}
完整AC代码如下:
AC代码
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
var expandBinaryTree = function(root) {
const dfs = (r)=>{
if(!r) return;
if(r.left){
dfs(r.left);
const leftNode = new TreeNode(-1,r.left,null);
r.left = leftNode;
}
if(r.right){
dfs(r.right);
const rightNode = new TreeNode(-1,null,r.right);
r.right = rightNode;
}
}
dfs(root);
return root;
};
说在后面
🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。