题目链接

https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/

题目大意

给定一个二叉树

struct Node {

int val;

Node *left;

Node *right;

Node *next;

}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

初始状态下,所有 next 指针都被设置为 NULL。

进阶:

你只能使用常量级额外空间。

使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。

给一颗二叉树,要求每个节点与最右边的节点相连接,注意区别:这题和116题意思不太相同,116题还可以保证每个节点的左右子树都存在(除非叶子节点)。

其次,本题难点还在于要求常数的内存空间,这就排除了使用队列进行层次遍历的做法

最后,本题对于递归遍历的顺序还有要求:即需要先遍历右子树,再遍历左子树



在这幅图中,如果先遍历左子树,再遍历右子树,那么从9---1之间的指针在遍历以2为根节点的左子树时没有被连接,这样会造成以7为根节点的右子树0,无法找到右边相邻的8

//本题将条件限制为 二叉树
//与116题注意区分,不一定左子树存在
//注意递归左右子树的区别 class Solution {
public:
Node *getnext(Node *root){
if(!root) return root;
if(root->left) return root->left;
if(root->right) return root->right; return getnext(root->next);
} Node* connect(Node* root) {
if(!root) return root;
if(root->left && root->right) root->left->next=root->right;
if(root->left && !root->right) root->left->next=getnext(root->next);
if(root->right) root->right->next=getnext(root->next); //无论左子树是否为空,均需要找到相邻的右子树
// if(!root->left && root->right) root->right->next=getnext(root->next); connect(root->right);
connect(root->left);
return root;
}
}

初次的做法:

 Node* connect(Node* root) {//注意需要判空 节点位置的信息可能为空
//怎么维护左边起的第二个节点??
// if(!root || !root->left) return root;
if(!root) return root;
if(root->left){
Node *tmp=NULL, *start=root;
if(start->right) tmp=start->right;
else{
while(start->next){
if(start->next->left) {
tmp=start->next->left;
break;
}
else if(start->next->right){
tmp=start->next->right;
break;
}
else{
start=start->next;
}
}
}
root->left->next=tmp;
} if(root->next){
if(root->right){
if(root->next->left)
root->right->next=root->next->left;
else
root->right->next=root->next->right;
}
} connect(root->right);
connect(root->left);
return root;
}

leetcode 117. 填充每个节点的下一个右侧节点指针 II(二叉树,DFS)的更多相关文章

  1. Java实现 LeetCode 117 填充每个节点的下一个右侧节点指针 II(二)

    117. 填充每个节点的下一个右侧节点指针 II 给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每 ...

  2. [LeetCode] 116. 填充每个节点的下一个右侧节点指针

    题目链接 : https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/ 题目描述: 给定一个完美二叉树 ...

  3. Java实现 LeetCode 116 填充每个节点的下一个右侧节点指针

    116. 填充每个节点的下一个右侧节点指针 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点.二叉树定义如下: struct Node { int val; Node *left ...

  4. [leetcode-117]填充每个节点的下一个右侧节点指针 II

    (1 AC) 填充每个节点的下一个右侧节点指针 I是完美二叉树.这个是任意二叉树 给定一个二叉树 struct Node { int val; Node *left; Node *right; Nod ...

  5. LeetCode OJ:Populating Next Right Pointers in Each Node II(指出每一个节点的下一个右侧节点II)

    Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...

  6. 【LeetCode】116. 填充每个节点的下一个右侧节点指针 Populating Next Right Pointers in Each Node 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcode ...

  7. 117. 填充每个节点的下一个右侧节点指针 II

    Q: 给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右 ...

  8. leetcode117. 填充每个节点的下一个右侧节点指针 II

    给定一个二叉树struct Node {  int val;  Node *left;  Node *right;  Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节 ...

  9. leetcode 116填充每个节点的下一个右侧节点指针

    time O(n) ,sapce O(n) /* // Definition for a Node. class Node { public: int val; Node* left; Node* r ...

随机推荐

  1. 使用uniapp开发项目来的几点心得体会,供新手参考参考

    先说一下提前须要会的技术 要想快速入手uniapp的话,你最好提前学会vue.微信小程序开发,因为它几乎就是这两个东西的结合体,不然,你就只有慢慢研究吧. 为什么要选择uniapp??? 开发多个平台 ...

  2. linux下postgresql安装

    1.下载地址 https://www.enterprisedb.com/download-postgresql-binaries 2.创建用户并修改密码 [root@node01 ~]# userad ...

  3. idea的下载与安装

    1.下载idea.到idea的官网选择你需要下载的,你最喜欢的版本https://www.jetbrains.com/idea/download/ 2.下载jdk.进入Oracle官网,鼠标指在Dow ...

  4. 浅谈JAVA代码优化

    JAVA代码的优化分为两个方面: 一.减小代码的体积.二.提高代码的执行效率. ============================================================ ...

  5. 【涂鸦物联网足迹】用煲仔饭来说明IaaS/PaaS/SaaS的区别

    最近在准备一些科普性的知识内容,发现大家对于一些基础性的知识概念还是有点模糊.今天先来简单介绍一下IaaS/PaaS/SaaS的区别~ 其实还有一个On-Premises(本地部署)的概念,也可以一并 ...

  6. js上 十八、字符串

    十八.字符串 #18.1.认识字符串 #什么是字符串 字符串可以是引号中的任意文本.字符串可以由双引号(")或单引号(')表示 ,如 'hello' , "中国" #为什 ...

  7. s2-061 漏洞复现

    0x00 漏洞简介 Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架.Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执 ...

  8. 一听就懂:用Python做一个超简单的小游戏

    写它会用到 while 循环random 模块if 语句输入输出函数

  9. Ubuntu系统的ifconfig命令不能执行

    新安装的Ubuntu想要用WinSCP传文件时发现,ifconfig命令用不了 ping www.baidu.com 获得回应,应该是ifconfig未安装 解决这个问题,首先如图(时间较长,获取:[ ...

  10. 什么是urlencode编码

    今天看文章中看到了urlencode,不理解 ,故上网查了查,看到了如下的答案,在此记录下,以加深印象 urlencode编码:就是将字符串以URL编码,一种编码方式,主要为了解决url中中文乱码问题 ...