面试题 117. 填充每个节点的下一个右侧节点指针 II
题目来源:力扣(LeetCode)
https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/
解题:
// 使用常量空间,不是完美二叉树
public Node connect(Node root) {
if(root == null){
return null;
}
Node firstNode = null; // 记录下一层第一个不为空的节点
Node lastNode = null; // 记录下一层正在遍历运行的节点
Node curNode = root; // 当前层正在遍历的节点
Node nextNode = null; // 当前层正在遍历的节点的副本
// 循环每一层
while(curNode != null){
firstNode = null; // 每开始一层遍历都不能确定其下层第一个节点,赋值为 null。
lastNode = null; // 每开始一层遍历都不能确定其下层正在遍历运行的节点,赋值为 null。
nextNode = curNode; // 当前层正在遍历的节点的赋值给副本
// 循环当前层
while(nextNode != null){ // 当前正在遍历的不为空,即当前层没遍历完
if(nextNode.left != null){ // 当前层有左孩子
if(lastNode != null){ // 下一层正在遍历的节点不为空,可以获得其右下一个指针的值
lastNode.next = nextNode.left;
}
if(firstNode == null){ // 用于记录下一层第一个节点,方便下一层迭代
firstNode = nextNode.left;
}
lastNode = nextNode.left; // 下一层正在遍历运行的节点右移
}
if(nextNode.right != null){ // 当前层有右孩子
if(lastNode != null){ // 下一层正在遍历的节点不为空,可以获得其右下一个指针的值
lastNode.next = nextNode.right;
}
if(firstNode == null){ // 用于记录下一层第一个节点,方便下一层迭代
firstNode = nextNode.right;
}
lastNode = nextNode.right; // 下一层正在遍历运行的节点右移
}
nextNode = nextNode.next; // 遍历当前层的下一个节点
}
curNode = firstNode; // 开启下一次迭代
}
return root;
}