我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/description/
题目描述:
知识点:递归、树的深度优先遍历
思路一:和LeetCode116——填充同一层的兄弟节点思路一相同
本题是LeetCode116——填充同一层的兄弟节点的加强版。
JAVA代码:
public class Solution {
public void connect(TreeLinkNode root) {
LinkedList<TreeLinkNode> linkedList = new LinkedList<>(); //linkedList[i]用来存储第i层的一个节点
dfs(root, 0, linkedList);
}
private void dfs(TreeLinkNode root, int level, LinkedList<TreeLinkNode> linkedList){
if(null == root){ //如果root为null,直接返回
return;
}
if(linkedList.size() <= level){
linkedList.add(root);
}else{
TreeLinkNode treeLinkNode = linkedList.get(level);
treeLinkNode.next = root;
linkedList.remove(level);
linkedList.add(level, root);
}
dfs(root.left, level + 1, linkedList);
dfs(root.right, level + 1, linkedList);
}
}
LeetCode解题报告:
思路二:非递归实现
由于本题不是一棵完全二叉树,对于某个节点的左孩子,其next不能直接指向其右孩子,而对于其右孩子的next,也不能直接指向该节点的next节点的左孩子。因此LeetCode116——填充同一层的兄弟节点中的思路二是行不通的,我们需要进行改进。
用first指针指向上一层节点中的第一个非空节点,p指针指向当前节点的父节点,cur指针指向当前节点。
本质上是对LeetCode116——填充同一层的兄弟节点中的思路三的改进。
时间复杂度为O(n),其中n为树中的节点个数。空间复杂度为O(1)。
JAVA代码:
public class Solution {
public void connect(TreeLinkNode root) {
if(null == root){
return;
}
TreeLinkNode first = root;
while(null != first){
TreeLinkNode p = first;
TreeLinkNode cur = null;
first = null;
while(null != p){
if(null != p.left){
if(null != cur){
cur.next = p.left;
cur = cur.next;
}else{
cur = p.left;
first = p.left;
}
}
if(null != p.right){
if(null != cur){
cur.next = p.right;
cur = cur.next;
}else{
cur = p.right;
first = p.right;
}
}
p = p.next;
}
}
}
}
LeetCode解题报告: