leetcode — populating-next-right-pointers-in-each-node
/**
*
* Source : https://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node/
* Source : https://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/
*
*
*
* Given a binary tree
*
* struct TreeLinkNode {
* TreeLinkNode *left;
* TreeLinkNode *right;
* TreeLinkNode *next;
* }
*
* Populate each next pointer to point to its next right node.
* If there is no next right node, the next pointer should be set to NULL.
*
* Initially, all next pointers are set to NULL.
*
* 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
* / \
* 2 3
* / \ / \
* 4 5 6 7
*
* After calling your function, the tree should look like:
*
* 1 -> NULL
* / \
* 2 -> 3 -> NULL
* / \ / \
* 4->5->6->7 -> NULL
*
* 下面是II,如果是一般二叉树而不是特殊的完全二叉树,求解,因为适合II的解同样可以解决问题I,这里直接解决问题II
*
*
* * Follow up for problem "Populating Next Right Pointers in Each Node".
* What if the given tree could be any binary tree? Would your previous solution still work?
*
* Note:
* You may only use constant extra space.
*
* For example,
* Given the following binary tree,
*
* 1
* / \
* 2 3
* / \ \
* 4 5 7
*
* After calling your function, the tree should look like:
*
* 1 -> NULL
* / \
* 2 -> 3 -> NULL
* / \ \
* 4-> 5 -> 7 -> NULL
*
*/
public class PopulatingNextRightPointers {
/**
*
* 将二叉树的每一层节点连接成为一个单向链表
*
* 假设当前层已经连接好,那么下一层怎么连接?
* 从当前层的最左节点开始
* 如果当前根节点root的左右子树都为空,则直接向后移动一个节点
*
* leftMost = root.left != null ? root.left : root.right
* cur = leftMost
*
* 循环当前一层的所有节点,知道2下一个节点为空,说明当前层循环完
* 左右子树中至少有一个,:
* 如果cur==左子树,如果右子树不为空则将cur.next = root.right,且将cur和root向后移,cur = cur.next,root = root.next
* 如果cur == 右子树,直接将根节点向后移root = root.next
* 如果cur和左右子树都不相同,则说明cur属于上一个根节点的子节点
* 如果当前根节点的左右子节点都为空,根节点向后移
* 否则更新cur,cur = root.left != null ? root.left : root.right,cur = cur.next
*
* 对下一层(上面已经连接成链表)进行递归
*
* @param root
* @return
*/
public TreeLinkedNode populate (TreeLinkedNode root) {
// 没有子节点,将当前层向后移动一个
while (root != null && root.leftChild == null && root.rightChild == null) {
root = root.next;
}
if (root == null) {
return null;
}
TreeLinkedNode leftMost = root.leftChild != null ? root.leftChild : root.rightChild;
TreeLinkedNode cur = leftMost;
while (root != null) {
if (cur == root.leftChild) {
if (root.rightChild != null) {
cur.next = root.rightChild;
cur = cur.next;
}
root = root.next;
} else if (cur == root.rightChild) {
root = root.next;
} else {
if (root.leftChild == null && root.rightChild == null) {
root = root.next;
} else {
cur.next = root.leftChild != null ? root.leftChild : root.rightChild;
cur = cur.next;
}
}
}
populate(leftMost);
return root;
}
public TreeLinkedNode populateByIterator (TreeLinkedNode root) {
TreeLinkedNode leftMost = root;
while (leftMost != null) {
root = leftMost;
// 没有子节点,将当前层向后移动一个
while (root != null && root.leftChild == null && root.rightChild == null) {
root = root.next;
}
if (root == null) {
return null;
}
leftMost = root.leftChild != null ? root.leftChild : root.rightChild;
TreeLinkedNode cur = leftMost;
while (root != null) {
if (cur == root.leftChild) {
if (root.rightChild != null) {
cur.next = root.rightChild;
cur = cur.next;
}
root = root.next;
} else if (cur == root.rightChild) {
root = root.next;
} else {
if (root.leftChild == null && root.rightChild == null) {
root = root.next;
} else {
cur.next = root.leftChild != null ? root.leftChild : root.rightChild;
cur = cur.next;
}
}
}
}
return root;
}
private class TreeLinkedNode {
int value;
TreeLinkedNode next;
TreeLinkedNode leftChild;
TreeLinkedNode rightChild;
public TreeLinkedNode(int value) {
this.value = value;
}
}
public TreeLinkedNode createTree (char[] treeArr) {
TreeLinkedNode[] tree = new TreeLinkedNode[treeArr.length];
for (int i = 0; i < treeArr.length; i++) {
if (treeArr[i] == '#') {
tree[i] = null;
continue;
}
tree[i] = new TreeLinkedNode(treeArr[i]-'0');
}
int pos = 0;
for (int i = 0; i < treeArr.length && pos < treeArr.length-1; i++) {
if (tree[i] != null) {
tree[i].leftChild = tree[++pos];
if (pos < treeArr.length-1) {
tree[i].rightChild = tree[++pos];
}
}
}
return tree[0];
}
public static void main(String[] args) {
PopulatingNextRightPointers nextRightPointers = new PopulatingNextRightPointers();
char[] arr = new char[]{'1','2','3','4','5','#','7'};
TreeLinkedNode root = nextRightPointers.createTree(arr);
nextRightPointers.populate(root);
root = nextRightPointers.createTree(arr);
nextRightPointers.populateByIterator(root);
}
}
leetcode — populating-next-right-pointers-in-each-node的更多相关文章
- 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 ...
- [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 ...
- [LeetCode] Populating Next Right Pointers in Each Node 每个节点的右向指针
Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...
- 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 ...
- [leetcode]Populating Next Right Pointers in Each Node II @ Python
原题地址:https://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/ 题意: Follow up ...
- LeetCode: Populating Next Right Pointers in Each Node II 解题报告
Populating Next Right Pointers in Each Node IIFollow up for problem "Populating Next Right Poin ...
- LEETCODE —— Populating Next Right Pointers in Each Node
Populating Next Right Pointers in Each Node Given a binary tree struct TreeLinkNode { TreeLinkNode * ...
- LeetCode - Populating Next Right Pointers in Each Node II
题目: Follow up for problem "Populating Next Right Pointers in Each Node". What if the given ...
- LeetCode: Populating Next Right Pointers in Each Node 解题报告
Populating Next Right Pointers in Each Node TotalGiven a binary tree struct TreeLinkNode { Tree ...
- [LeetCode] [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 ...
随机推荐
- Django合集
Django基础 Django--简介 Django--web框架简介 浅析uWSGI.uwsgi.wsgi Django--url(路由)配置 Django--模板层 Django--视图层 Dja ...
- Android应用程序支持不同屏幕(尺寸、密度)
how to build a user interface using Android layouts for all types of devices 使用Android布局设计的UI接口用于不同的 ...
- DEDECMS织梦文章摘要批量更改方法
我们建站有时候需要直接把数据库导入,只要修改一下基本的名称信息就可以直接用,但是遇用到一些问题.比如文章摘要不会随着文章内容的更新而更新.织梦(dede)在添加文章的时候会自动生成文章摘要,如果重新修 ...
- ARTS Challenge- Week 1 (2019.03.25~2019.03.31)
1.Algorithm - at least one leetcode problem per week(Medium+) 986. Interval List Intersections https ...
- tf.contrib.slim arg_scope
缘由 最近一直在看深度学习的代码,又一次看到了slim.arg_scope()的嵌套使用,具体代码如下: with slim.arg_scope( [slim.conv2d, slim.separab ...
- Markdown基础语法笔记
# 一级标题## 二级标题### 三级标题###### #号之后记得加一个空格 仅支持1-6级标题 ### 列表 - 文本1 - 文本2 - 文本3+ 列表2* 列表2 ### 有序列表1. 有序文 ...
- Java for Android 第三周学习总结
第五章 核心类 java.lang.Object中的方法: clone(创建并返回该对象的一个副本.实现这个方法的一个类,将支持对象的复制) equals(将该对象和传入的对象进行比较.必须实现这个算 ...
- Centos7 编译安装 Nginx PHP Mariadb Memcached 扩展 ZendOpcache扩展 (实测 笔记 Centos 7.3 + Openssl 1.1.0e + Mariadb 10.1.22 + Nginx 1.12.0 + PHP 7.1.4 + Laravel 5.4 )
环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7-x86_64-Minimal-1611.iso 安装步骤: 1.准备 1.0 查看硬 ...
- linux-Vim命令合集
Vim命令合集 命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filena ...
- JAVA 热文
Java技术面试篇 Javase基础面试题(1) Javase基础面试题(2) Javase基础面试题(3) Javase基础面试题(4) Javase基础面试题(5) Javaweb面试题(6) J ...