给定一个二叉树

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);
}
}
}
};

最新文章

  1. Unity 编译错误记录
  2. gulp如何使用
  3. iOS获取当前时间
  4. CentOS安装MongoDB
  5. cordova
  6. jq ajax遇到的错误集合
  7. 网站的PV,UV,IP名词解释
  8. sh和bash的区别
  9. 简单的html5 File base64 图片上传
  10. Godaddy主机从购买到开通的详细图文教程(2013年)
  11. Java 中 静态方法与非静态方法的区别
  12. tocken和ticket的数据模型;
  13. 根据百度,gps坐标获取天气
  14. angular4.0中form表单双向数据绑定正确姿势
  15. js最常用正则表达式集合
  16. Material Design5.x动画实现解析篇一
  17. findbugs插件使用
  18. caffe中 softmax 函数的前向传播和反向传播
  19. 计蒜客-跳跃游戏二 (简单dp)
  20. JAVA (1)&ndash;第一个GUI程序 添加标题 关闭窗口 屏幕位置 导入图标

热门文章

  1. 题解-SHOI2005 树的双中心
  2. 3. 搞定收工,PropertyEditor就到这
  3. mysql 查询出来的内容无法显示全部
  4. 超简单的 Docker部署 SpringBoot项目 步骤
  5. Websocket---认识篇
  6. python线性回归
  7. Python利用zmail收取邮件
  8. wuter 使用了腾讯云Ubuntu系统,但是没有root权限怎么办?
  9. 将两个ListMap中同下标的map去重合并
  10. Java将List中的实体按照某个字段进行分组的算法