Leetcode 树 Populating Next Right Pointers in Each Node II

本文介绍了一种解决任意二叉树中节点next指针连接问题的算法。通过广度优先搜索(BFS)的方式,将同一层的节点连接在一起,并确保只使用常数额外空间。文中还对比了与完美二叉树的不同之处。

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

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie


Populating Next Right Pointers in Each Node II

  Total Accepted: 9695  Total Submissions: 32965

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



题意:给定一棵任意二叉树(不一定是perfect binary tree),将它每一个节点的next指针都指向该节点右边的节点

思路:bfs
这里不能用dfs了,只能用bfs
bfs遍历将同一层的节点存放在同一个数组里,
然后在遍历每个数组,将前面的节点和后面的节点connect起来,
最后一个节点和NULL connect起来
需要定义一个新的struct结构,保存指向每个节点的指针和该节点所在的层

复杂度:时间O(n), 空间O( n)
相关题目:

Populating Next Right Pointers in Each Node



/**
 * Definition for binary tree with next pointer.
 * struct TreeLinkNode {
 *  int val;
 *  TreeLinkNode *left, *right, *next;
 *  TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
 * };
 */
class Solution {
public:




    
    struct TreeLinkNodeWithLevel
    {
    	TreeLinkNode *p;
    	int level;
    	TreeLinkNodeWithLevel(TreeLinkNode *pp, int l):p(pp), level(l){}
    };
    
    
    void connect(TreeLinkNode *root) {
    	vector<vector<TreeLinkNode *> > nodes;
    	queue<TreeLinkNodeWithLevel> q;
    	q.push(TreeLinkNodeWithLevel(root, 0));
    	while (!q.empty())
    	{
    		TreeLinkNodeWithLevel cur = q.front(); q.pop();
    		if(!cur.p) continue;
    		if(cur.level >= nodes.size()){
    			vector<TreeLinkNode *> temp;
    			temp.push_back(cur.p);
    			nodes.push_back(temp);
    		}else{
    			nodes[cur.level].push_back(cur.p);
    		}
    		TreeLinkNodeWithLevel left(cur.p->left, cur.level + 1);
    		TreeLinkNodeWithLevel right(cur.p->right, cur.level + 1);
    		q.push(left);
    		q.push(right);
    	}
    	for(int i = 0; i < nodes.size(); i++){
    		for(int j = 0; j < nodes[i].size() - 1; j++){
    			nodes[i][j]->next = nodes[i][j + 1];
    		}
    		nodes[i][nodes[i].size() - 1]->next = NULL;
    	}
    }
};


根据引用\[1\]、\[2\]和\[3\]的代码,这是一个解决LeetCode 116题的Python代码。这个问题是关于填充每个节点的下一个右侧节点指针,使其指向其右侧节点的题目。代码中定义了一个Node类,其中包含了节点的值、左子节点、右子节点和下一个右侧节点指针。代码中的Solution类包含了一个connect方法,用于连接每个节点的下一个右侧节点指针。具体的实现方式有几种不同的方法,包括使用队列层序遍历、递归和带记忆的前序遍历。你可以根据自己的喜好选择其中一种方法来解决这个问题。 #### 引用[.reference_title] - *1* [【LeetCode】116. Populating Next Right Pointers in Each Node 解题报告(Python)](https://blog.csdn.net/L141210113/article/details/107134602)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【LeetCode】116. 填充每个节点的下一个右侧节点指针 Populating Next Right Pointers in Each Node 解题...](https://blog.csdn.net/fuxuemingzhu/article/details/79559645)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [LeetCode第116题—填充每个节点的下一个右侧节点指针—Python实现](https://blog.csdn.net/qq_16184125/article/details/117201474)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值