地址 https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/
给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 初始状态下,所有 next 指针都被设置为 NULL。 进阶: 你只能使用常量级额外空间。 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。 示例 输入:root = [1,2,3,4,5,null,7] 输出:[1,#,2,3,#,4,5,7,#] 解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 所示。
算法1
主要考虑树的上下移动与横向链表的移动
树的移动在函数递归中解决
横向链表使用一个while(p->next!=NULL) p=p->next;也可以解决
两者结合就是在递归函数中要传递横向链表。
考虑到横向链表的头的下一层也可以通过横向链表获取,所以递归传递每一层的横向链表的头
C++ 代码
/* // Definition for a Node. class Node { public: int val; Node* left; Node* right; Node* next; Node() : val(0), left(NULL), right(NULL), next(NULL) {} Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {} Node(int _val, Node* _left, Node* _right, Node* _next) : val(_val), left(_left), right(_right), next(_next) {} }; */ class Solution { public: void dfs(Node* start ,Node* root) { if (root == NULL) return; if (start == NULL) start = root; if ( start != root){ Node* p = start; while (p!= NULL && p->next != NULL) p = p->next; p->next = root; } Node* nextStart = NULL; while (start != NULL) { nextStart = (start->left == NULL ? start->right: start->left); if (nextStart == NULL) { start = start->next; } else { break; } } dfs(nextStart, root->left); dfs(nextStart, root->right); } Node* connect(Node* root) { dfs(NULL,root); return root; } };