Given a binary tree

  1. struct TreeLinkNode {
  2. TreeLinkNode *left;
  3. TreeLinkNode *right;
  4. TreeLinkNode *next;
  5. }

Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set toNULL.

Initially, all next pointers are set toNULL.

Note:

  • You may only use constant extra space.
  • You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).

For example,
Given the following perfect binary tree,

  1. 1
  2. / \
  3. 2 3
  4. / \ / \
  5. 4 5 6 7

After calling your function, the tree should look like:

  1. 1 -> NULL
  2. / \
  3. 2 -> 3 -> NULL
  4. / \ / \
  5. 4->5->6->7 -> NULL
  6.  
  7. 题中要求二叉树为完美二叉树(满二叉树,Perfect binary tree),其性质为一个深度为k(>=-1)且有2^(k+1) - 1个结点。通俗的讲,叶节点处于同一层,除叶节点以外其他结点均有左右孩子。详情见博友veli的博客。题目要求用常数O(1)空间,故不能用队列等。
    要是能用队列,则可以用层次遍历中的方法三,然后每次从queue中取出一个元素时,将其next指针指向queue中下一个节点即可,可惜不满足题意。
    因为,不能用常规的队列解决问题,所以遇到几个难点。一、如何构成循环;二、如何从一个结点的左孩子转到右孩子。网友们给出了解题思路,非本人原创,这里仅给出自己的理解。
    思路:类似的层次遍历思想,用firLeft记录下每层的最左端的结点,然后从左往右遍历,值得注意的是,每层的最右端元素的next不必重新指向NULL ,因为,二叉树的结构体中,每个结点的next是自动赋为NULL的。这就产生一个问题:如何从一层转向下一层,即循环条件。因为,二叉树为完美二叉树,
    一般结点的(非叶节点)的左右孩子都是存在的,故可以以结点的左孩子或者右孩子是否存在来为条件;二是,如何在层内移动,核心思想为,用上一层的节点控制下一层的指向。对某一节点,其左孩子直接指向右孩子即可,节点之间,其next若是存在,则用该结点的右孩子指向其next的左孩子。最后
    firLeft=firLeft->left即可。
  1. /**
  2. * Definition for binary tree with next pointer.
  3. * struct TreeLinkNode {
  4. * int val;
  5. * TreeLinkNode *left, *right, *next;
  6. * TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. void connect(TreeLinkNode *root)
  12. {
  13. if(root==NULL) return;
  14.  
  15. TreeLinkNode *firLeft=root;
  16. while(firLeft->left)
  17. {
  18. TreeLinkNode *parNode=firLeft;
  19. while(parNode)
  20. {
  21. parNode->left->next=parNode->right;
  22. if(parNode->next)
  23. parNode->right->next=parNode->next->left;
  24.  
  25. parNode=parNode->next;
  26. }
  27. firLeft=firLeft->left;
  28. }
  29. }
  30. };

方法二:递归,见Grandyang的博客

  1. // Recursion, more than constant space
  2. class Solution {
  3. public:
  4. void connect(TreeLinkNode *root) {
  5. if (!root) return;
  6. if (root->left) root->left->next = root->right;
  7. if (root->right) root->right->next = root->next? root->next->left : NULL;
  8. connect(root->left);
  9. connect(root->right);
  10. }
  11. };

[Leetcode] Populating next right pointer in each node 填充每个节点的右指针的更多相关文章

  1. [LeetCode] Populating Next Right Pointers in Each Node II 每个节点的右向指针之二

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

  2. LeetCode: Populating Next Right Pointer in Each Node

    LeetCode: Populating Next Right Pointer in Each Node Given a binary tree struct TreeLinkNode { TreeL ...

  3. [Leetcode] Populating next right pointer in each node ii 填充每个节点的右指针

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

  4. [LeetCode] 117. 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 ...

  5. 117 Populating Next Right Pointers in Each Node II 每个节点的右向指针 II

    这是“每个节点的右向指针”问题的进阶.如果给定的树可以是任何二叉树,该怎么办?你以前的解决方案仍然有效吗?注意:    你只能使用恒定的空间.例如,给定以下二叉树,         1       / ...

  6. LeetCode:Populating Next Right Pointers in Each Node I II

    LeetCode:Populating Next Right Pointers in Each Node Given a binary tree struct TreeLinkNode { TreeL ...

  7. [LeetCode] Populating Next Right Pointers in Each Node 每个节点的右向指针

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  8. LeetCode: Populating Next Right Pointers in Each Node II 解题报告

    Populating Next Right Pointers in Each Node IIFollow up for problem "Populating Next Right Poin ...

  9. LEETCODE —— Populating Next Right Pointers in Each Node

    Populating Next Right Pointers in Each Node Given a binary tree struct TreeLinkNode { TreeLinkNode * ...

随机推荐

  1. mysql在cmd里中文乱码解决办法

    右边画红线部分中文已经乱码,左边红线里中文则完美显示出来了. 解决办法   用set  names   utf-8: 效果如图

  2. laravel -- 路由

    基本路由 Route::get('/get',function (){ return "this is get"; }); Route::post('/post',function ...

  3. video.js使用技巧

    https://www.awaimai.com/2053.html https://www.jianshu.com/p/16fa00a1ca8e

  4. Python实现多属性排序

    Python实现多属性排序 多属性排序:假如某对象有n个属性,那么先按某规则对属性a进行排序,在属性a相等的情况下再按某规则对属性b进行排序,以此类推. 现有对象Student: class Stud ...

  5. HTTP学习之HTTP基础

    学习HTTP技术,首先要了解它的在web通信中有哪些特点,起到什么作用.有哪些规范.都有什么功能. HTTP的特点 HTTP使用的是一种可靠的.快速响应的数据传输协议,用户一旦发起请求,Web服务器可 ...

  6. poj_2339

    参考:https://blog.csdn.net/yzl_rex/article/details/7600906 https://blog.csdn.net/acm_JL/article/detail ...

  7. responsive grid

    http://csswizardry.com/csswizardry-grids/ http://unsemantic.com/demo-responsive http://getbootstrap. ...

  8. 20145202马超 实验二《Java面向对象程序设计》实验报告

    实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...

  9. P1331 海战

    P1331 海战 题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线.不幸的是因为种种原因,国防 ...

  10. Python全栈面试题

    Mr.Seven   博客园 首页 新随笔 联系 订阅 管理 随笔-132  文章-153  评论-516  不吹不擂,你想要的Python面试都在这里了[315+道题]   写在前面 近日恰逢学生毕 ...