LeetCode | Populating Next Right Pointers in Each Node II

本文提供了一种解决二叉树中填充每个节点的下一个右侧节点指针问题的方法,包括使用层次遍历的解法1及利用next指针实现常数额外空间复杂度的解法2。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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
分析

用层次遍历的方法可以比较直观的解决这题(解法1)。

由于题目给出了next指针这个辅助空间,我们可以借助这个指针省去层次遍历里的队列,从而实现O(1)空间复杂度的解法(解法2)。

解法1

import java.util.LinkedList;
import java.util.Queue;

public class PopulatingNextRightPointersInEachNodeII {
	public void connect(TreeLinkNode root) {
		if (root == null) {
			return;
		}
		Queue<TreeLinkNode> queue = new LinkedList<TreeLinkNode>();
		Queue<TreeLinkNode> nextQueue = new LinkedList<TreeLinkNode>();
		queue.add(root);
		TreeLinkNode left = null;
		while (!queue.isEmpty()) {
			TreeLinkNode node = queue.poll();
			if (left != null) {
				left.next = node;
			}
			left = node;
			if (node.left != null) {
				nextQueue.add(node.left);
			}
			if (node.right != null) {
				nextQueue.add(node.right);
			}
			if (queue.isEmpty()) {
				Queue<TreeLinkNode> temp = queue;
				queue = nextQueue;
				nextQueue = temp;
				left = null;
			}
		}
	}
}
解法2

public class PopulatingNextRightPointersInEachNodeII {
	public void connect(TreeLinkNode root) {
		if (root == null) {
			return;
		}

		TreeLinkNode nextHead = null;
		TreeLinkNode p = root;
		TreeLinkNode pre = null;
		while (p != null) {
			if (p.left != null) {
				if (pre == null) {
					pre = p.left;
					nextHead = pre;
				} else {
					pre.next = p.left;
					pre = pre.next;
				}
			}
			if (p.right != null) {
				if (pre == null) {
					pre = p.right;
					nextHead = pre;
				} else {
					pre.next = p.right;
					pre = pre.next;
				}
			}
			p = p.next;
			if (p == null) {
				p = nextHead;
				nextHead = null;
				pre = null;
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值