给定一个二叉树

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

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

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

说明:

  • 你只能使用额外常数空间。
  • 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
  • 你可以假设它是一个完美二叉树(即所有叶子节点都在同一层,每个父节点都有两个子节点)。

示例:

给定完美二叉树,

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

调用你的函数后,该完美二叉树变为:

  1. 1 -> NULL
  2. / \
  3. 2 -> 3 -> NULL
  4. / \ / \
  5. 4->5->6->7 -> NULL
  6.  
  7. 递归法:因为是完美二叉树,如果有左子树,一定有右子树。我们将结点的左子树和右子树相连。
    如果结点next不为空,那么将结点右子树指向结点next的左子树。
    同时递归处理左子树和右子树。
  1. public class Solution {
  2. public void connect(TreeLinkNode root) {
  3. if(root==null)return ;
  4. if(root.left!=null){
  5. root.left.next=root.right;
  6. if(root.next!=null)root.right.next=root.next.left;
  7.  
  8. }
  9.  
  10. connect(root.left);
  11. connect(root.right);
  12. }
  13. }

层序遍历法:

  1. /*
  2. *利用层序遍历,每一层都将指针指向他的下一个结点,
  3. *这里用size标记每一层是否遍历完毕。
  4. *
  5. */
  6. public class Solution {
  7. public void connect(TreeLinkNode root) {
  8. if(root==null)return ;
  9. Queue<TreeLinkNode> q=new LinkedList();
  10. q.add(root);
  11. while(!q.isEmpty()){
  12. int size=q.size();
  13. for(int i=;i<size;i++){
  14. TreeLinkNode temp=q.peek();q.poll();
  15. if(i<size-)temp.next=q.peek();
  16. if(temp.left!=null)q.add(temp.left);
  17. if(temp.right!=null)q.add(temp.right);
  18. }
  19. }
  20. }
  21. }

最巧妙地:利用层指针和深度的指针

  1. public class Solution {
  2. public void connect(TreeLinkNode root) {
  3. if(root==null)return ;
  4. TreeLinkNode cur=null,start=root;
  5. while(start.left!=null){
  6. cur=start;
  7. while(cur!=null){
  8. cur.left.next=cur.right;
  9. if(cur.next!=null)cur.right.next=cur.next.left;
  10. cur=cur.next;
  11. }
  12. start=start.left; //这个地方是left,不是next
  13. }
  14. }
  15. }

leetcode-每个节点的右向指针(填充同一层的兄弟节点)的更多相关文章

  1. [leetcode] 117. 填充同一层的兄弟节点 II

    117. 填充同一层的兄弟节点 II 与116. 填充同一层的兄弟节点完全一样,二叉树的层次遍历..这是这次不是完美二叉树了 class Solution { public void connect( ...

  2. [leetcode] 116. 填充同一层的兄弟节点

    116. 填充同一层的兄弟节点 其实就是个二叉树的层次遍历 class Solution { public void connect(TreeLinkNode root) { if (root == ...

  3. LeetCode(117):填充同一层的兄弟节点 II

    Medium! 题目描述: 给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *n ...

  4. LeetCode 116/117. 填充同一层的兄弟节点(Populating Next Right Pointers in Each Node)

    题目描述 给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } 填充 ...

  5. LeetCode(116):填充同一层的兄弟节点

    Medium! 题目描述: 给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *n ...

  6. 【LeetCode】116#填充同一层的兄弟节点

    题目描述 给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } 填充 ...

  7. [Java]LeetCode116. 填充同一层的兄弟节点 | Populating Next Right Pointers in Each Node

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

  8. [Java]LeetCode117. 填充同一层的兄弟节点 II | Populating Next Right Pointers in Each Node II

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

  9. Leetcode116. Populating Next Right Pointers in Each Node填充同一层的兄弟节点

    给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } 填充它的每个 ...

随机推荐

  1. 一个实现 手机端“输入验证码 ”效果Demo

    之前在“掘金”上看到这样一个demo 我觉得很有意思,于是今天把它搬下来,记在自己的“小本本”里也许会对以后的项目有点用,若要自己去实现这样一个案例也能实现,但是可能没有那么“妙”. 想法: 1.使用 ...

  2. leetcode -50. Pow(x, n) Accepted

    前言:其实之前自己也有了解关于算法数据结构的一点内容,但是都是用相应的开发工具来写相应的代码,今天面试的时候直接leetcode来写代码,还是用的体内根深蒂固的C和Java来解的题,毕竟目前没见支持O ...

  3. Linux 下让终端走代理的方法

    转载: https://blog.fazero.me/2015/09/15/%E8%AE%A9%E7%BB%88%E7%AB%AF%E8%B5%B0%E4%BB%A3%E7%90%86%E7%9A%8 ...

  4. Vue中使用webpack别名的方法

    在工作中,我们经常会写出这种代码: import MHeader from '../../components/m-header/m-header' @import "../../commo ...

  5. Java 常见BUG 整理

    1.BigDecimal初始化double 2.Integer   java对于-128到127之间的数,会进行缓存,这个范围的Integer对象是同一个! == 是ok,但是超出这个范围就不可以用 ...

  6. mariadb或者mysql查看某个库相关的用户授权信息

    mariadb或者mysql查看某个库相关的授权信息 SELECT * FROM mysql.Db WHERE Db='DB_NAME';

  7. JQ+css3 导航栏到底部上移

    导航栏 .navigation { position: fixed; bottom: 100px; right: 100px; z-index:; } .navigation { transition ...

  8. 【python 虚拟环境 virtualenv的配置】

    该目录内生成一个虚目录: #运行activcate下的shell脚本,激活虚拟环境 #pip  python包管理器

  9. 一图看懂JVM,JRE,JDK的关系

  10. 【Zookeeper】编程实战之Zookeeper分布式锁实现秒杀

    1. Zookeeper简述 我们要了解一样技术,首先应该要到它的官网,因为官网的信息一般都是最准确的,如下图是Zookeeper官网对它的介绍. 从官网的介绍中,可以总结出,Zookeeper是一个 ...