标签:定义 code pre 遍历 队列 层次遍历 顺序存储 递归 pop
描述:
填充每一个节点的下一个右侧指针,给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
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
标签:定义 code pre 遍历 队列 层次遍历 顺序存储 递归 pop
原文地址:https://www.cnblogs.com/wangkaia/p/11964299.html