LeetCode Populating Next Right Pointers in Each Node II

本文探讨了一种解决二叉树层次遍历问题的方法,通过对递归预处理方法进行优化,解决了二叉树层数不确定的问题。文章还提供了一种使用队列实现的层次遍历方法,并对比了两种方法的时间效率。

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

有意思,看了题意,我只想说一句:上一题的方法依然好使,我只把64改成640就提交通过了。我却迷惑了,任意的二叉树640层完全不够用呀,1000层,10000层也有可能呀,难道还有什么更好的方法吗?

想到了层次遍历的方法,这样,对于任意的二叉树层次遍历开辟的空间取决于二叉树的最大宽度,而不是最大深度(上面的方法是),试了试也能通过,虽然层次遍历没用递归,但时间并没有减少多少,可能是编译器测试用例不够吧,这题感觉还是层次遍历更好点。两种方法如下:

TreeLinkNode* layers[640];
void preOrderLayer(TreeLinkNode *root,int layer)//,TreeLinkNode *&layers
{
	if (layers[layer]==NULL)
	{
		layers[layer] = root;
	}
	else
	{
		layers[layer]->next = root;
		layers[layer] = root;
	}
	if(root->left)
		preOrderLayer(root->left,layer+1);
	if(root->right)
		preOrderLayer(root->right,layer+1);
}

void connect(TreeLinkNode *root) {
	if(root==NULL)
		return ;

	for (int i=0;i<640;i++)
		layers[i] = NULL;
	int layer = 0;
	preOrderLayer(root,layer);
	for (int i=0;i<640&&layers[i]!=NULL;i++)
	{
		layers[i]->next = NULL;
	}
}
struct QueNode{  
	int num;  
	TreeLinkNode *pTreeLinkNode;  
	QueNode():num(0),pTreeLinkNode(NULL){}  
};  
void connect02(TreeLinkNode *root) {   
	if(root==NULL)  
		return ;  
	queue<QueNode> que;  
	QueNode qn;  
	qn.num = 0;  
	qn.pTreeLinkNode = root;  
	que.push(qn);  
	QueNode tempNode,tempLeftNode,tempRightNode;  
	int lastnum = 0;
	TreeLinkNode *plast = NULL;
	while(!que.empty())  
	{  
		tempNode = que.front();  
		que.pop();  
		if (lastnum!=tempNode.num)  
		{  
			plast->next = NULL;
			lastnum = tempNode.num;  
			plast = tempNode.pTreeLinkNode;
		}  
		else  
		{
			if(plast)
				plast->next = tempNode.pTreeLinkNode;
			plast = tempNode.pTreeLinkNode;
		} 
		if (tempNode.pTreeLinkNode->left)  
		{  
			tempLeftNode.num = tempNode.num+1;  
			tempLeftNode.pTreeLinkNode = tempNode.pTreeLinkNode->left;  
			que.push(tempLeftNode);  
		}  
		if (tempNode.pTreeLinkNode->right)  
		{  
			tempRightNode.num = tempNode.num+1;  
			tempRightNode.pTreeLinkNode = tempNode.pTreeLinkNode->right;  
			que.push(tempRightNode);  
		}     
	}  
	plast->next = NULL; 
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值