使用指针连接二叉树中的所有兄弟节点
Connect All Siblings in Binary Tree Using Pointers
问题:https://www.educative.io/m/connect-all-siblings
我试图通过创建一个虚拟节点来连接所有兄弟节点,并使用下一个指针将其设置在我们当前访问的节点旁边,但是在执行代码之后:
public static void populate_sibling_pointers(BinaryTreeNode root) {
if(root == null) return;
Queue<BinaryTreeNode> q = new LinkedList<>();
q.offer(root);
while(!q.isEmpty()){
int size = q.size();
BinaryTreeNode dummy = new BinaryTreeNode(0);
for(int i = 0; i < size; i++){
BinaryTreeNode cur = q.poll();
dummy.next = cur;
dummy = dummy.next;
if(cur.left!=null){
q.offer(cur.left);
}
if(cur.right!=null){
q.offer(cur.right);
}
}
}
}
我仍然没有通过一些测试,但我不确定我在这里做错了什么。
感谢您的帮助!
两个问题:
您应该只创建一个 new
虚拟节点 一次。通过在 while
循环的每次迭代中创建一个新的,您打破了 next
引用链。因此,该节点的创建应该发生在之前 while
循环。
next
链中的最后一个节点应将其 next
设置为 null
。
这是更正后的代码:
class connectSiblings{
public static void populate_sibling_pointers(BinaryTreeNode root) {
if(root == null) return;
Queue<BinaryTreeNode> q = new LinkedList<>();
q.offer(root);
BinaryTreeNode dummy = new BinaryTreeNode(0);
while(!q.isEmpty()){
int size = q.size();
for(int i = 0; i < size; i++){
BinaryTreeNode cur = q.poll();
dummy.next = cur;
dummy = dummy.next;
if(cur.left!=null){
q.offer(cur.left);
}
if(cur.right!=null){
q.offer(cur.right);
}
}
}
dummy.next = null;
}
}
您可以通过使用 next
引用将 LinkedList
的使用替换为您正在构建的实际链表来进一步优化此代码:当树的一层已正确连接时next
引用,你可以迭代那个链表的那部分来找到并连接下一层的节点,然后它可以作为下一层的链表,......等等
问题:https://www.educative.io/m/connect-all-siblings
我试图通过创建一个虚拟节点来连接所有兄弟节点,并使用下一个指针将其设置在我们当前访问的节点旁边,但是在执行代码之后:
public static void populate_sibling_pointers(BinaryTreeNode root) {
if(root == null) return;
Queue<BinaryTreeNode> q = new LinkedList<>();
q.offer(root);
while(!q.isEmpty()){
int size = q.size();
BinaryTreeNode dummy = new BinaryTreeNode(0);
for(int i = 0; i < size; i++){
BinaryTreeNode cur = q.poll();
dummy.next = cur;
dummy = dummy.next;
if(cur.left!=null){
q.offer(cur.left);
}
if(cur.right!=null){
q.offer(cur.right);
}
}
}
}
我仍然没有通过一些测试,但我不确定我在这里做错了什么。 感谢您的帮助!
两个问题:
您应该只创建一个
new
虚拟节点 一次。通过在while
循环的每次迭代中创建一个新的,您打破了next
引用链。因此,该节点的创建应该发生在之前while
循环。next
链中的最后一个节点应将其next
设置为null
。
这是更正后的代码:
class connectSiblings{
public static void populate_sibling_pointers(BinaryTreeNode root) {
if(root == null) return;
Queue<BinaryTreeNode> q = new LinkedList<>();
q.offer(root);
BinaryTreeNode dummy = new BinaryTreeNode(0);
while(!q.isEmpty()){
int size = q.size();
for(int i = 0; i < size; i++){
BinaryTreeNode cur = q.poll();
dummy.next = cur;
dummy = dummy.next;
if(cur.left!=null){
q.offer(cur.left);
}
if(cur.right!=null){
q.offer(cur.right);
}
}
}
dummy.next = null;
}
}
您可以通过使用 next
引用将 LinkedList
的使用替换为您正在构建的实际链表来进一步优化此代码:当树的一层已正确连接时next
引用,你可以迭代那个链表的那部分来找到并连接下一层的节点,然后它可以作为下一层的链表,......等等