每日LeetCode —— 623. 在二叉树中增加一行

93 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情

题目描述

       给定一个二叉树的根root,以及两个值val、depth,要求将值为val的节点插入到二叉树的depth-1层的所有节点的左右孩子中,原depth-1层的左孩子变为新插入节点的左孩子,原depth-1层的右节点变为新插入节点的右孩子。

例1:输入:数的层次遍历为:[1,3,4,2,5,null,8]  val=3  depth=1  输出:树的层次遍历为:[1,3,4,1,1,1,1,2,null,null,5,null,null,null,8]

1.png

解释:输入的二叉树的树形结构如上图所示,在第三层插入值为1的节点后应变为下图所示结构,第二层的所有节点的左右孩子变为新的值为1的节点,第二层原先的左右孩子变为新插入节点的左孩子或者右孩子。

2.png

本题值得注意的地方

  • 如果输入的depth为1的特殊情况时,此时应该将根节点变为新节点的左孩子。

原题地址:623. 在二叉树中增加一行

解题思路

       首先当depth为1时,直接创建一个值为val的节点node,然后把node的左孩子指向根节点即可。

      当depth大于1时,我们首先应该做的是找到depth-1层的所有节点,然后依次的处理depth-1层的所有节点。处理的思路:记录当前节点的左右孩子,创建两个新的值为val的节点node1、node2,node1的左孩子指向原先节点的左孩子,node2的右孩子指向原先节点的右孩子。然后将原先节点的左右孩子分别指向新节点node1、node2即可,就这样处理完depth-1层的所有节点即可。

       对于如何找到depth-1层的所有节点,可以利用队列的方式来获取,之前的一个文章中的解题思路中已经解释原理,这里就不再赘述。获取二叉树某层的节点

实现代码

class Solution {
public:
    TreeNode* addOneRow(TreeNode* root, int val, int depth) {
        // 单独处理depth为1的特殊情况
        if(depth == 1){
            TreeNode *node = new TreeNode(val);
            node->left = root;
            return node;
        }
        // 利用队列记录每层的所有节点
        queue<TreeNode*> queue;
        queue.push(root);
        int dep = 1,num = 1;
        // 寻找 depth-1 层的所有节点
        while(dep<depth-1){
            dep++;
            num = queue.size();
            while(num--){
                auto t = queue.front();
                queue.pop();
                if(t->left) queue.push(t->left);
                if(t->right) queue.push(t->right);
            }
        }
        // 处理 depth-1 层的所有节点
        while(queue.size()){
            auto t = queue.front();
            queue.pop();
            // 创建两个新的值为val的节点,将原先节点的左孩子放到node1的左孩子中,将原先节点的右孩子放到node2的右孩子中
            TreeNode *node1 = new TreeNode(val,t->left,nullptr),*node2 = new TreeNode(val,nullptr,t->right);
            // 将节点的左右孩子指向新创建的值为val的节点
            t->left = node1,t->right=node2;
        }
        return root;
    }
};