LeetCode117 每个节点的右向指针 II
2024-09-06 02:20:40
给定一个二叉树
struct TreeLinkNode {
TreeLinkNode *left;
TreeLinkNode *right;
TreeLinkNode *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL
。
初始状态下,所有 next 指针都被设置为 NULL
。
说明:
- 你只能使用额外常数空间。
- 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
示例:
给定二叉树,
1
/ \
2 3
/ \ \
4 5 7
调用你的函数后,该二叉树变为:
1 -> NULL
/ \
2 -> 3 -> NULL
/ \ \
4-> 5 -> 7 -> NULL
/*
算法思想:
实际上是树的层序遍历的应用。
这道题是每个节点的右向指针这道题的延伸。即不是完美二叉树了。但是还是可以一样的方法,所以这种非递归的解法很通用,因为是用的层次遍历加队列它才不管你是不是完美二叉树呢。需要用到queue来辅助,由于是层序遍历,每层的节点都按顺序加入queue中,而每当从queue中取出一个元素时,将其next指针指向queue中下一个节点即可。需要巧妙的通过给queue中添加空指针NULL来达到分层的目的,使每层的最后一个节点的next可以指向NULL。
*/
//算法实现:
/**
* Definition for binary tree with next pointer.
* struct TreeLinkNode {
* int val;
* TreeLinkNode *left, *right, *next;
* TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
* };
*/
class Solution {
public:
void connect(TreeLinkNode *root) {
if (!root) return;
queue<TreeLinkNode*> q;
q.push(root);
q.push(NULL);
while (true) {
TreeLinkNode *cur = q.front();
q.pop();
if (cur) {
cur->next = q.front();
if (cur->left)
q.push(cur->left);
if (cur->right)
q.push(cur->right);
}
else {
if (q.size() == 0 || q.front() == NULL)
return;
q.push(NULL);
}
}
}
};
最新文章
- Unity 编译错误记录
- gulp如何使用
- iOS获取当前时间
- CentOS安装MongoDB
- cordova
- jq ajax遇到的错误集合
- 网站的PV,UV,IP名词解释
- sh和bash的区别
- 简单的html5 File base64 图片上传
- Godaddy主机从购买到开通的详细图文教程(2013年)
- Java 中 静态方法与非静态方法的区别
- tocken和ticket的数据模型;
- 根据百度,gps坐标获取天气
- angular4.0中form表单双向数据绑定正确姿势
- js最常用正则表达式集合
- Material Design5.x动画实现解析篇一
- findbugs插件使用
- caffe中 softmax 函数的前向传播和反向传播
- 计蒜客-跳跃游戏二 (简单dp)
- JAVA (1)&ndash;第一个GUI程序 添加标题 关闭窗口 屏幕位置 导入图标