leetcode 117. 填充每个节点的下一个右侧节点指针 II(二叉树,DFS)
题目链接
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)的更多相关文章
- Java实现 LeetCode 117 填充每个节点的下一个右侧节点指针 II(二)
117. 填充每个节点的下一个右侧节点指针 II 给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每 ...
- [LeetCode] 116. 填充每个节点的下一个右侧节点指针
题目链接 : https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/ 题目描述: 给定一个完美二叉树 ...
- Java实现 LeetCode 116 填充每个节点的下一个右侧节点指针
116. 填充每个节点的下一个右侧节点指针 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点.二叉树定义如下: struct Node { int val; Node *left ...
- [leetcode-117]填充每个节点的下一个右侧节点指针 II
(1 AC) 填充每个节点的下一个右侧节点指针 I是完美二叉树.这个是任意二叉树 给定一个二叉树 struct Node { int val; Node *left; Node *right; Nod ...
- 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 ...
- 【LeetCode】116. 填充每个节点的下一个右侧节点指针 Populating Next Right Pointers in Each Node 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcode ...
- 117. 填充每个节点的下一个右侧节点指针 II
Q: 给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右 ...
- leetcode117. 填充每个节点的下一个右侧节点指针 II
给定一个二叉树struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节 ...
- leetcode 116填充每个节点的下一个右侧节点指针
time O(n) ,sapce O(n) /* // Definition for a Node. class Node { public: int val; Node* left; Node* r ...
随机推荐
- Consul集成Envoy实践
单节点Consul集成Envoy进行安全服务通信 前言 Consul Service Mesh通过授权和加密来保护服务之间的通信,还可以拦截有关服务到服务通信的数据并将其呈现给监视工具.我们可以使 ...
- python 字典常用操作
字典键是唯一的,但值则不是 一个简单的字典 dict = {"guo":"1106","tang":"0809",&qu ...
- 报错 ncclCommInitRank failed.
环境 4 GeForce GTX 1080 GPUS docker image nnabla/nnabla-ext-cuda-multi-gpu:py36-cuda102-mpi3.1.6-v1.14 ...
- Redis 设计与实现 4:字典
Redis 中,字典是基础结构.Redis 数据库数据.过期时间.哈希类型都是把字典作为底层结构. 字典的结构 哈希表 哈希表的实现代码在:dict.h/dictht ,Redis 的字典用哈希表的方 ...
- 深入浅出JVM(一):你写得.java文件是如何被加载到内存中执行的
众所周知,.java文件需要经过编译生成.class文件才能被JVM执行. 其中,JVM是如何加载.class文件,又做了些什么呢? .class文件通过 加载->验证->准备->解 ...
- 怎么同步fork原git项目
如何实现 有时候,我们看到有价值的git项目,通常,我们会选择把原项目fork过来,然后自己去把玩研究.然而,原项目进行了更新,fork过来的代码却还是原来的版本,那有没有什么做法,能同时更新到我自己 ...
- JDBC(六)—— 数据库事务
数据库事务 事务 一组逻辑操作单元,使数据从一种状态变换到另一种状态 事务处理 保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式. 当在一个事务中执行多个操作时,要么所有事 ...
- CSS解析
CSS(层叠样式表) CSS层叠样式表(Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言. ...
- java中网络通信 Scoket
在客户/服务器通信模式中,客户端需要主动建立与服务器连接的Socket,服务器端收到客户端的连接请求,也会创建与客户端连接的Socket.Socket可以看做是通信连接两端的收发器,客户端和服务店都通 ...
- 记录一次 Nginx 配置 proxy_pass 后 返回404问题
一. Nginx 配置 proxy_pass 后 返回404问题 故障解决和定位 1.1. 问题 在一次生产涉及多次转发的配置中, 需求是下面的图: 在配置好了 proxy_pass 之后,请求 ww ...