装饰树

69 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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]

解释:如下图所示,
image.png

示例 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]

解释:如下图所示
image.png

提示:

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前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。