LC-填充每个节点指向最右节点的next指针II

本文介绍了一种在二叉树中填充每个节点指向最右节点的next指针的算法。通过迭代方式实现,适用于任意二叉树结构,确保每个节点的next指针正确指向其最右侧的相邻节点。

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

填充每个节点指向最右节点的next指针II

//填充每个节点指向最右节点的next指针II
/*
继续思考"填充每个节点指向最右节点的next指针" 这道题
如果给定的树可以是任意的二叉树呢?你之前的给出的算法还有效吗?
*/
#include<vector>
using namespace std;
struct TreeLinkNode {
	int val;
	TreeLinkNode *left, *right, *next;
	TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
};
class Solution {
public:
	void connect(TreeLinkNode *root) {
		while (root)
		{
			TreeLinkNode dummy(-1);
			TreeLinkNode *prev;
			prev = &dummy;
			for (auto p = root; p; p = p->next)
			{
				if (p->left)
				{
					prev->next = p->left;
					prev = prev->next;
				}
				if (p->right)
				{
					prev->next = p->right;
					prev = prev->next;
				}
			}
			root = dummy.next;
		}
	}



	void Connect(TreeLinkNode* root)
	{
		if (!root)
			return;
		TreeLinkNode *p = root;
		TreeLinkNode *q;
		while (p->left)
		{
			q = p;
			while (q)
			{
				if (q->left && q->right)
				{
					q->left->next = q->right;
				}
				if (q->left && !q->right && q->next)
				{
					TreeLinkNode* q2 = q;
					while (q2->next && !q2->next->left && !q2->next->right)
					{
						q2 = q2->next;
					}
					if (q2->next && q2->next->left)
						q->left->next = q2->next->left;
					if (q2->next && q2->next->right)
						q->left->next = q2->next->right;
				}

				if (q->right && q->next)
				{
					TreeLinkNode *q3 = q;
					while (q3->next && !q3->next->left && !q3->next->right)
					{
						q3 = q3->next;
					}
					if (q3->next && q3->next->left)
						q->right->next = q3->next->left;
					if (q3->next && q3->next->right)
						q->right->next = q3->next->right;
				}
				q = q->next;
			}
			p = p->left;
		}
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值