给定一个二叉树

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

第一道题是:leetcode-每个节点的右向指针(填充同一层的兄弟节点)

我们依然可以使用层序遍历的方法,为每个结点添加next指针。

但是时间复杂度不满足要求。

public class Solution {
public void connect(TreeLinkNode root) {
if(root==null)return ;
Queue<TreeLinkNode> q=new LinkedList();
q.add(root);
while(!q.isEmpty()){
int size=q.size();
for(int i=;i<size;i++){
TreeLinkNode temp=q.peek();q.poll();
if(i<size-)temp.next=q.peek();
if(temp.left!=null)q.add(temp.left);
if(temp.right!=null)q.add(temp.right);
}
}
}

将第一题的递归方法进行改造:

比如该二叉树

        
    1
/ \
2 3
/ \ \
4 5 7
\    / \
 9  14 15
/ \
18 19   

遍历的顺序为:14->15   2->3    5->7      4->5    9->14   18->19

每次先处理结点的右子树,递归到叶子结点(没有左子树和右子树)。然后返回上一层,递归处理左子树。

类似于前序遍历的镜像:  trave(root.right) ;

            trave(root.left);

对每一层结点的处理可以通过tem=tem.next来进行跳转。

得到如下方法:

public class Solution {
public void connect(TreeLinkNode root) {
if(root==null)return;
TreeLinkNode tem=root;
//处理root左子树的指针
if(root.left!=null){
if(root.right!=null){
root.left.next=root.right;
}
//处理root.left.next的指向
while(tem.next!=null&&root.left.next==null){
tem=tem.next;//tem可以在同一层结点进行跳转
if(tem.left!=null)root.left.next=tem.left;
else if(tem.right!=null)root.left.next=tem.right;
} }
//处理root右子树的指针
if(root.right!=null){
//处理root.right.next的指向
while(tem.next!=null&&root.right.next==null){
tem=tem.next;//tem可以在同一层结点进行跳转
if(tem.left!=null)root.right.next=tem.left;
else if(tem.right!=null)root.right.next=tem.right;
} } connect(root.right);
connect(root.left);
}
}

结果:  执行用时: 1 ms, 在Populating Next Right Pointers in Each Node II的Java提交中击败了98.04% 的用户

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 116/117. 填充同一层的兄弟节点(Populating Next Right Pointers in Each Node)

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

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

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

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

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

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

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

  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. leetcode-每个节点的右向指针(填充同一层的兄弟节点)

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

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

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

随机推荐

  1. 【问题记录】uwsgi部署并启动俩个几乎一样的python flask web app,发现有一个app响应时间非常长

    uwsgi在同一台linux上启动python flask web app(俩个), 发现第一个和第二个的简单性能测试差距非常大,差了将近一倍: 第一个结果: Concurrency Level: 1 ...

  2. [转]Hadoop 读写数据流

    Hadoop文件读取 1)客户端通过调用FileSystem对象中的open()函数来读取它做需要的数据.FileSystem是HDFS中DistributedFileSystem的一个实例. 2)D ...

  3. 【转】Android:No implementation found for native

    解决方法: 1.检查native c code的定义: JNIEXPORT void Java_com_example_something_MyClass_getMyString(JNIEnv * e ...

  4. PAT乙级1007

    1007 素数对猜想 (20 分) 让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数.显然有d​1​​=1,且对于n>1有d​n​​是偶数.“素数对猜想 ...

  5. POJ 2251 Dungeon Master(多层地图找最短路 经典bfs,6个方向)

    Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 48380   Accepted: 18252 ...

  6. 以登录实现理解Servlet+jsp+JavaBean开发

    写在前面:菜鸟拙见,望请纠正 学过servlet的都知道,书本上一直说servlet一直作为控制器使用,它不实现view层,也不做具体的事务处理,那servlet到底是干什么的哪?怎么合理的用它呐?? ...

  7. 远程连接服务器端Jupyter Notebook

    1. 安装 输入命令: sudo apt-get install sshfs 2. 服务器端开启Jupyter Notebook Ubuntu服务器端安装过程参考:www.cnblogs.com/la ...

  8. ThinkPHP5.1中数据查询使用field方法数组参数起别名时遇到的问题

    首先数据库基本查询是没有问题的 <?php namespace app\index\controller; use think\Db; class Demo5 { //1.单条查询 public ...

  9. Redis--位图BitMap

    一.BitMap是什么 通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身,value对应0或1,我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存 ...

  10. R语言学习笔记(二十一):字符串处理中的元字符(代码展示)

    元字符有自己的特殊含义 [ ]内的任意字符将被匹配 grep(pattern = "[wW]", x = states, value = T) grep(pattern = &qu ...