前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >加一行!

加一行!

作者头像
公众号袁厨的算法小屋
发布2022-09-20 16:00:06
3830
发布2022-09-20 16:00:06
举报

今天看到一道有趣的题目,分享给大家。

题目不难,但是我感觉挺有意思,大家可以看一下。

做该题之前,我们先来复习下二叉树的基础知识,重点关注节点的层数和深度之间的关系

更多基础知识大家可以看这篇文章,一文读懂二叉树

话不多说,咱们直接看题。

leetcode 623在二叉树中增加一行

题目很容易理解,让我们在二叉树特定的层数添加一层特定的节点。见下图

有点丑见谅

大家有没有发现添加前和添加后,有什么不同?是不是多了一层节点,然后还变丑了?尽力了哈哈,还是画的不帅。

题目已经搞懂,那么大家看到这个题目的第一想法是什么呢?

我的想法是直接进行层序遍历,然后找到对应的层,直接添加新节点即可,和向链表中添加节点的含义类似。

大家如果忘记了层序遍历,可以去这个文章进行复习,这里对可以使用层序遍历的题目进行了总结。

揉碎二叉树

好啦既然我们已经有了做题思路,那么咱们直接直接将思路模拟出来吧!

我们使用这棵树来举例

向这棵树的第 3 层插入,值为 0 的节点。

http://mpvideo.qpic.cn/0bf2bmaayaaahuap65w5o5qfac6dbqfqadaa.f10002.mp4?dis_k=cea0c5b4d800c320d838c66bfbf2066f&dis_t=1663660775&vid=wxv_1938878820577542144&format_id=10002&support_redirect=0&mmversion=false

上面的动画中,为了表述清晰,所以将添加节点的步骤进行了省略,直接进行添加,具体步骤如下。

插入新节点步骤

好啦,到这里我们这个题目就解决啦,下面我们直接看代码吧,当然我这里只是一种写法,大家可以随意发挥。

BFS代码

代码语言:javascript
复制
class Solution {
    public TreeNode addOneRow(TreeNode root, int val, int depth) {
        
        int level = 0;
        Queue<TreeNode> queue = new LinkedList<>();
        if (depth == 1) {
            TreeNode test = new TreeNode(val);
            test.left = root;
            return test;
        }
        queue.add(root);
        while (!queue.isEmpty()) {
            level++;
            int size = queue.size();
            for (int i = 0 ; i < size; ++i) {
                TreeNode temp = queue.poll();
                if (level == depth - 1) {
                  TreeNode node1 = new TreeNode(val);
                  TreeNode node2 = new TreeNode(val);
                  node1.left = temp.left;
                  node2.right = temp.right;
                  temp.left = node1;
                  temp.right = node2;
                } else {
                     if (temp.left != null) queue.offer(temp.left);             
                     if (temp.right != null) queue.offer(temp.right);
                }                          
            }
            if (depth - 1 == level) break;          
        }
        return root;
    }
}

时间复杂度O(n)空间复杂度O(n)

当然这个题目也可以使用 dfs 解决,具体思路如下。是个很简单的深度优先搜索,当达到指定层数的某节点时,为其添加节点即可。

那我们来想一下结束递归的条件,当root == null 时,我们直接 return当我们搜索到待插入的那一层时,我们直接插入节点即可,否则的则继续进行搜索,代码很简单,比仅仅比二叉树的 dfs 多了一丢丢逻辑。

其实你搞定上面的那个方法,这个也很快就能想到嘞,那么我们直接看代码吧。

DFS代码

代码语言:javascript
复制
class Solution {
    public TreeNode addOneRow(TreeNode root, int val, int depth) {
        if (depth == 1) {
            TreeNode temp = new TreeNode(val);
            temp.left = root;
            return temp;
        }
        dfs(root,val,depth,1);
        return root;
    }
    public void dfs(TreeNode root, int val, int depth, int level) {
        if (root == null) {
            return;
        }
        if (level  == depth - 1) {
             TreeNode node1 = new TreeNode(val);
             TreeNode node2 = new TreeNode(val);
             node1.left = root.left;
             node2.right = root.right;
             root.left = node1;
             root.right = node2;
        } else {
            dfs(root.left, val, depth, level+1);
            dfs(root.right, val, depth, level+1);
        }
    }
}

时间复杂度O(n),空间复杂度O(n)。

好啦,今天就唠到这吧,有需要进入刷题小队的同学,可以小屋内点击刷题小队进入,拜了个拜。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序厨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • BFS代码
  • DFS代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档