Populating Next Right Pointers in Each Node
Posted wangkaia
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Populating Next Right Pointers in Each Node相关的知识,希望对你有一定的参考价值。
描述:
填充每一个节点的下一个右侧指针,给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
解答:
看到该问题的描述,从图形上直观的来看,本题和二叉树的层次遍历是相关的。因为填充右侧节点的操作总是在统一层上进
行的。而二叉树的遍历总是分为递归和迭代算法两种,我们也尝试使用两种算法来解决问题。
首先使用递归的算法,递归算法的核心是找出所有操作的自相似性,因此我们观察对于每个节点的操作。如果当前的节点为空
则不进行任何操作。若当前的节点不为空,若其左子树存在的话,则右子树也是必然存在的,且其next指向其右子树。右子树的next
取值则取决于当前节点的next,若当前节点的next存在,则右子树的next为root->next->left。则按照此分析写出来的递归代码如下:
class Solution { public: //首先为递归的写法,该道题为二叉树的层次遍历的应用 Node* connect(Node* root) { if(!root) return NULL; if(root->left) root->left->next=root->right; if(root->right) root->right->next=root->next?root->next->left:NULL; connect(root->left); connect(root->right); return root; } };
第二种方法是迭代算法,使用队列结构,将每一层的节点按照顺序存储起来,然后将其依次连接起来即可。按照该思路写出的代码如下:
class Solution { public: //使用迭代的方法来层次遍历二叉树的每个节点 Node* connect(Node* root) { if(!root) return NULL; queue<Node*> q; q.push(root); //每一层遍历前先统计该层的所有节点的个数 int size=q.size(); while(!q.empty()){ size=q.size(); for(int i=0;i<size;i++){ Node* t=q.front();q.pop(); //确保当前的队列当中仍然含有节点 if(i<size-1) t->next=q.front(); if(t->left) q.push(t->left); if(t->right) q.push(t->right); } } return root; } };
以上是关于Populating Next Right Pointers in Each Node的主要内容,如果未能解决你的问题,请参考以下文章
树Populating Next Right Pointers in Each Node
116. Populating Next Right Pointers in Each Node
116. Populating Next Right Pointers in Each Node
116. Populating Next Right Pointers in Each Node