继续思考"填充每个节点指向最右节点的next指针" 这道题
如果给定的树可以是任意的二叉树呢?你之前的给出的算法还有效吗?
注意:
- 你只能使用常量的额外内存空间
例如:
给出的二叉树如下:
调用完你给出的函数之后,这棵树应该变成:
import java.util.*;
public class Solution {
public void connect(TreeLinkNode root) {
// 使用层序遍历,让每个节点的next指针指向右侧节点
if(root == null) return ;
Deque<TreeLinkNode> queue = new LinkedList<TreeLinkNode>();
queue.add(root);
while(!queue.isEmpty()){
int curSize = queue.size();
for(int i=0;i<curSize;i++){
TreeLinkNode curNode = queue.poll();
if(i == curSize-1){ // 该层最后一个元素
curNode.next = null;
}else{
curNode.next = queue.peek();
}
if(curNode.left != null) queue.add(curNode.left);
if(curNode.right != null) queue.add(curNode.right);
}
}
return ;
}
} /**
* Definition for binary tree with next pointer.
* public class TreeLinkNode {
* int val;
* TreeLinkNode left, right, next;
* TreeLinkNode(int x) { val = x; }
* }
*/
public class Solution {
public void connect(TreeLinkNode root) {
while(root != null){
TreeLinkNode dummy = new TreeLinkNode(0);
TreeLinkNode cur = dummy;
while(root != null){
if(root.left != null){
cur.next = root.left;
cur = cur.next;
}
if(root.right != null){
cur.next = root.right;
cur = cur.next;
}
root = root.next;
}
root = dummy.next;
}
}
} public void connect(TreeLinkNode root) {
if(root == null){
return;
}
if(root.left == null && root.right == null){
return;
}
//用于标记每层第一个节点
TreeLinkNode firstOfEachRow = root;
//仍存在层未遍历
while(firstOfEachRow != null){
//用于标记上一个被连接节点
TreeLinkNode preNode = new TreeLinkNode(0);
//被连接节点的父节点
TreeLinkNode curNode = firstOfEachRow;
//下一层节点数量,用于实现首节点标记
int count = 0;
//下一层首节点
TreeLinkNode nextHead = null;
//未到当前层尾部
while(curNode != null){
//连接左节点
if(curNode.left != null){
//标记下一层第一个节点
if(count == 0){
nextHead = curNode.left;
count++;
}
//连接
preNode.next = curNode.left;
preNode = curNode.left;
}
//连接右节点
if(curNode.right != null){
//标记下一层第一个节点
if(count == 0){
nextHead = curNode.right;
count++;
}
//连接
preNode.next = curNode.right;
preNode = curNode.right;
}
curNode = curNode.next;
}
//转到下一层第一个节点
firstOfEachRow = nextHead;
}
} /**
* Definition for binary tree with next pointer.
* public class TreeLinkNode {
* int val;
* TreeLinkNode left, right, next;
* TreeLinkNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeLinkNode connect(TreeLinkNode root) {
TreeLinkNode head = root;
while(head!=null){
// 递归构造每一层的链表:从最左边元素连到最右边元素
// 当前节点是当前层的最左边节点,返回的是子节点一层的最左边节点
head = findNext(head, head.next);
}
return root;
}
// 子节点的最右边元素,是父节点的右边元素的子节点的最左边元素
// 返回当前节点子节点的最左边元素
public TreeLinkNode findNext(TreeLinkNode node, TreeLinkNode pNext){
TreeLinkNode next = null;
if(pNext!=null) {
next = findNext(pNext, pNext.next);
}
if(node.right!=null){
node.right.next = next;
next = node.right;
}
if(node.left!=null){
node.left.next = next;
next = node.left;
}
return next;
}
} public void connect(TreeLinkNode root) {
TreeLinkNode curLevel=null;
TreeLinkNode nextLevel=root;
boolean hasNextLevel=true;
//当还有下一层时
while(hasNextLevel)
{
hasNextLevel=false;
curLevel=nextLevel;
while(curLevel!=null)
{
TreeLinkNode curNode=curLevel;
//左右孩子节点均不为空
if(curNode.left!=null&&curNode.right!=null)
{
//记录下一层起始位置
if(!hasNextLevel)
{
nextLevel=curNode.left;
hasNextLevel=true;
}
//左右孩子节点
curNode.left.next=curNode.right;
curLevel=curLevel.next;
//堂兄弟节点
while(curLevel!=null)
{
if(curLevel.left!=null)
{
curNode.right.next=curLevel.left;
break;
}
else if(curLevel.right!=null)
{
curNode.right.next=curLevel.right;
break;
}
//下一个
curLevel=curLevel.next;
}
}
//左孩子不空
else if(curLevel.left!=null)
{
//记录下一层起始位置
if(!hasNextLevel)
{
nextLevel=curNode.left;
hasNextLevel=true;
}
curLevel=curLevel.next;
//堂兄弟节点
while(curLevel!=null)
{
if(curLevel.left!=null)
{
curNode.left.next=curLevel.left;
break;
}
else if(curLevel.right!=null)
{
curNode.left.next=curLevel.right;
break;
}
//下一个
curLevel=curLevel.next;
}
}
//右孩子不空
else if(curLevel.right!=null)
{
//记录下一层起始位置
if(!hasNextLevel)
{
nextLevel=curNode.right;
hasNextLevel=true;
}
curLevel=curLevel.next;
//堂兄弟节点
while(curLevel!=null)
{
if(curLevel.left!=null)
{
curNode.right.next=curLevel.left;
break;
}
else if(curLevel.right!=null)
{
curNode.right.next=curLevel.right;
break;
}
//下一个
curLevel=curLevel.next;
}
}
else
{
curLevel=curLevel.next;
}
}
}
}
层序遍历
public class Solution {
public void connect(TreeLinkNode root) {
if (root == null)
return;
TreeLinkNode dummy = new TreeLinkNode(-1);
TreeLinkNode cur;
TreeLinkNode prev = dummy;
for (cur = root; cur != null; cur = cur.next) {
if (cur.left != null) {
prev.next = cur.left;
prev = prev.next;
}
if (cur.right != null) {
prev.next = cur.right;
prev = prev.next;
}
}
connect(dummy.next);
}
}
//渣渣一个。。抄的别人的 自己想了很久才想明白
//移动一个cur指针,来完成在当前层上的next指针赋值,
//如果像1一样,因为不是满二叉树,直接想通过判断left或者rigth是否为空,
//来赋值,那样判断特别多。
//用一个指针来记录当前层的第一个节点
public class Solution {
public void connect(TreeLinkNode root) {
if(root==null){
return ;
}
while(root!=null){
TreeLinkNode templevelfirst=new TreeLinkNode(0);//记录当前层的第一个节点
TreeLinkNode cur=templevelfirst;//负责移动的指针,cur和root不是在一层,cur移动在root的下一层,这个是更核心,记录当前层的第一个节点的指针
//在一中也用到了,(是p)
while(root!=null){
if(root.left!=null){
cur.next=root.left;//在第一次循环时,给templevelfirst的next赋值了,记录的就是当前层的第一个节点
cur=cur.next;
}
if(root.right!=null){
cur.next=root.right;
cur=cur.next;
}
root=root.next;//遍历这一层,向右移动
}
root=templevelfirst.next;//向下移动
}
}
}
import java.util.ArrayList;
public class Solution {
public void connect(TreeLinkNode root) {
if(root == null)return;
ArrayList<ArrayList<TreeLinkNode>> db = new ArrayList<ArrayList<TreeLinkNode>>();
ArrayList<TreeLinkNode> dbs;
dbs = new ArrayList<TreeLinkNode>();
dbs.add(root);
db.add(dbs);
int a=0;
while(dbs != null && dbs.size() != 0){
dbs = new ArrayList<TreeLinkNode>();
for(int i = 0; i < db.get(a).size(); i ++){
if(db.get(a).get(i).left != null)
dbs.add(db.get(a).get(i).left);
if(db.get(a).get(i).right != null)
dbs.add(db.get(a).get(i).right);
}
a ++;
if(dbs.size() != 0)
db.add(dbs);
}
for(int i = 0; i < db.size(); i ++){
for(int j = 0; j < db.get(i).size(); j ++){
if(j == db.get(i).size() - 1)
db.get(i).get(j).next = null;
else
db.get(i).get(j).next = db.get(i).get(j + 1);
}
}
}
} /**
* Definition for binary tree with next pointer.
* public class TreeLinkNode {
* int val;
* TreeLinkNode left, right, next;
* TreeLinkNode(int x) { val = x; }
* }
*/
import java.util.*;
public class Solution {
public void connect(TreeLinkNode root) {
if (root == null)
return;
LinkedList<TreeLinkNode> queue = new LinkedList<TreeLinkNode>();
queue.offer(root);
int size = 0;
TreeLinkNode p = null;
TreeLinkNode q = null;
while (!queue.isEmpty()) {
size = queue.size();
for (int i = 0; i < size; ++i) {
q = queue.poll();
if (i != 0) {
p.next = q;
}
if (i == size - 1) {
q.next = null;
}
p = q;
if (q.left != null)
queue.offer(q.left);
if (q.right != null)
queue.offer(q.right);
}
}
return;
}
} //层序遍历的思想做这道理思路应该是很清晰简单的。
public void connect(TreeLinkNode root) {
Queue<TreeLinkNode> queue=new LinkedList<>();
if(root==null) return ;
queue.add(root);
while(!queue.isEmpty()){
int layerSize=queue.size();
while(layerSize--!=0){
TreeLinkNode node=queue.poll();
if(layerSize!=0) node.next=queue.peek();
else node.next=null;
if(node.left!=null) queue.add(node.left);
if(node.right!=null) queue.add(node.right);
}
}
}
import java.util.*;
// 层次遍历,记录每一层的结点个数,循环设置next指针
public void connect(TreeLinkNode root) {
if(root == null) return;
Queue<TreeLinkNode> queue = new LinkedList<>();
queue.add(root);
int curCount = 1;
int nextCount = 0;
while ( ! queue.isEmpty()) {
TreeLinkNode[] arr = new TreeLinkNode[curCount]; // 存放一层结点
for (int i = 0; i < curCount; i ++) {
TreeLinkNode curNode = queue.poll();
arr[i] = curNode;
if(curNode.left != null) {
queue.add(curNode.left);
nextCount ++;
}
if(curNode.right != null) {
queue.add(curNode.right);
nextCount ++;
}
}
for (int i = 0; i < arr.length - 1; i ++) {
arr[i].next = arr[i + 1];
}
curCount = nextCount;
nextCount = 0;
}
}
public class Solution { public void connect(TreeLinkNode root) { while(root != null){ TreeLinkNode tempChild = new TreeLinkNode(0); TreeLinkNode currentChild = tempChild; while(root!=null){ if(root.left != null) { currentChild.next = root.left; currentChild = currentChild.next;} if(root.right != null) { currentChild.next = root.right; currentChild = currentChild.next;} root = root.next; } root = tempChild.next; } } }
public class Solution { //based on level order traversal public void connect(TreeLinkNode root) { TreeLinkNode head = null; //head of the next level TreeLinkNode prev = null; //the leading node on the next level TreeLinkNode cur = root; //current node of current level while (cur != null) { while (cur != null) { //iterate on the current level //left child if (cur.left != null) { if (prev != null) { prev.next = cur.left; } else { head = cur.left; } prev = cur.left; } //right child if (cur.right != null) { if (prev != null) { prev.next = cur.right; } else { head = cur.right; } prev = cur.right; } //move to next node cur = cur.next; } //move to next level cur = head; head = null; prev = null; } } }