当前位置: 首页 > news >正文

1516. 移动 N 叉树的子树 DFS

1516. 移动 N 叉树的子树

给定一棵没有重复值的 N 叉树的根节点 root ,以及其中的两个节点 p 和 q

移动节点 p 及其子树,使节点 p 成为节点 q 的直接子节点。如果 p 已经是 q 的直接子节点,则请勿改动任何节点。节点 p 必须是节点 q 的子节点列表的最后一项。

返回改动后的树的根节点

节点 p 和 q 可能是下列三种情况之一:

  1. 节点 q 在节点 p 的子树中。
  2. 节点 p 在节点 q 的子树中。
  3. 节点 p 不在节点 q 的子树中,且节点 q 也不在节点 p 的子树中。

在第 2 种和第 3 种情况中,你只需要移动 p (及其子树),使 p 成为 q 的子节点。但是在第 1 种情况中,树的节点可能会断连,因此你还需要重新连接这些节点。请在解题前仔细阅读示例。

N 叉树的输入序列以层序遍历的形式给出,每组子节点用 null 分隔(见示例)。

例如,上面的树会被序列化为 [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]。

示例 1:

输入: root = [1,null,2,3,null,4,5,null,6,null,7,8], p = 4, q = 1
输出: [1,null,2,3,4,null,5,null,6,null,7,8]
解释: 该示例属于第二种情况,节点 p 在节点 q 的子树中。我们可以移动节点 p 及其子树,使 p 成为节点 q 的直接子节点。
注意,节点 4 是节点 1 的最后一个子节点。

示例 2:

输入: root = [1,null,2,3,null,4,5,null,6,null,7,8], p = 7, q = 4
输出: [1,null,2,3,null,4,5,null,6,null,7,8]
解释: 节点 7 已经是节点 4 的直接子节点,因此我们不改动任何节点。

示例 3:

输入: root = [1,null,2,3,null,4,5,null,6,null,7,8], p = 3, q = 8
输出: [1,null,2,null,4,5,null,7,8,null,null,null,3,null,6]
解释: 该示例属于第三种情况,节点 p 不在节点 q 的子树中,反之亦然。我们可以移动节点 3 及其子树,使之成为节点 8 的子节点。

提示:

  • 节点的总数在 [2, 1000] 间。
  • 每个节点都有 唯一 的值。
  • p != null
  • q != null
  • p 和 q 是两个不同的节点(即 p != q )。

原文链接

做题结果

成功。这题难的地方是最复杂的情况一没有示例。

补充情况一说明:

如果p是q的直接、间接父节点,则把pq从树中断开,q放在原本p的位置,p放在q的最后一个节点(p中原本为q的部分已断开)

方法:DFS

1. 找到 p 和 q 的关系,找到他们的父节点pParent和qParent

2. 如果p是q的父节点,则需要断开q,q从父节点移除,q放在本来p的位置

3. p需要重父节点移除,然后放到q的最后一个子节点

class Solution {
        Node pParent;
        Node qParent;
        public Node moveSubTree(Node root, Node p, Node q) {
            Node pre = new Node(0);
            pre.children = new ArrayList<>();
            pre.children.add(root);
            fillTime(pre,p,q);
            //1.q 是 p 的直接父类
            if(pParent==q) return root;
            //2.p 是 q 的间接、直接父类

            int id = pParent.children.indexOf(p);
            pParent.children.remove(p);
            if(isParent(p,q)){
                qParent.children.remove(q);
                pParent.children.add(id,q);
            }
            q.children.add(p);
            return pre.children.get(0);
        }

        private boolean isParent(Node p,Node q){
            for(Node item:p.children){
                if(item==q || isParent(item,q)) return true;
            }
            return false;
        }

        private void fillTime(Node root,Node p,Node q){
            if(root.children!=null){
                for(Node next:root.children){
                    if(next==p) pParent=root;
                    if(next==q) qParent=root;
                    fillTime(next,p,q);
                }
            }
        }
    }

 

相关文章:

  • 【计算机图形学】高级外观建模
  • 阿里云dataworks中业务流程中问题(odps2)
  • 数据库基础小练习
  • java计算机毕业设计基于安卓Android/微信小程序的汽车租赁小程序-app
  • 学习-Java类和对象之访问限制
  • MATLAB2016笔记(十一):基本粒子群优化算法(PSO)的MATLAB实现
  • MyBatisPlus总结
  • 14天刷爆LeetCode算法学习计划——Day02双指针(2)
  • 《数据结构》时间复杂度
  • Redis 3 - 集群
  • HTTPS优化——协议优化,证书优化,会话复用
  • sqlplus rlwrap: error: Cannot execute sqlplus: Too many levels of symbolic lin
  • 【36C++STL-常用容器----3、stack容器详解】
  • yolo系列之yolov5(3)
  • 动手捣鼓一个log打印调试模块
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【技术性】Search知识
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Android Studio:GIT提交项目到远程仓库
  • Android Volley源码解析
  • java8-模拟hadoop
  • JavaScript 基础知识 - 入门篇(一)
  • nodejs实现webservice问题总结
  • Python十分钟制作属于你自己的个性logo
  • Solarized Scheme
  • web标准化(下)
  • 安装python包到指定虚拟环境
  • 从0实现一个tiny react(三)生命周期
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 给第三方使用接口的 URL 签名实现
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 使用 QuickBI 搭建酷炫可视化分析
  • 试着探索高并发下的系统架构面貌
  • 微信小程序开发问题汇总
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • gunicorn工作原理
  • scrapy中间件源码分析及常用中间件大全
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ![CDATA[ ]] 是什么东东
  • #NOIP 2014# day.2 T2 寻找道路
  • (2)STM32单片机上位机
  • (3)llvm ir转换过程
  • (备忘)Java Map 遍历
  • (南京观海微电子)——I3C协议介绍
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (四) Graphivz 颜色选择
  • (转)Linq学习笔记
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .gitignore文件—git忽略文件
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET上SQLite的连接
  • /etc/shadow字段详解
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...