题目描述:
给定一棵二叉树的根节点,按照从上往下的顺序打印每一个节点,同一层的节点按照从左往右的顺序打印
示例:
分析:
遇到这中涉及到二叉树的层次问题的时候,利用队列这种数据结构可以使问题变得非常简单。
首先将根节点加入队列,然后从队列头部取出根节点。
如果节点的左右孩子非空,则依次将其加入到队列尾部。
最终所有节点在队列中的顺序恰好是树的层次遍历的顺序。
代码:
void levelPrint(treeNode *root){
if(root==NULL) return;
queue<treeNode *> q;
q.push(root);
while(!q.empty()){
treeNode *t=q.front();
q.pop();
cout<<t->val<<endl;
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
}
相关问题:
1、Populating Next Right Pointers in Each Node (leetcode 116 & 117)
若二叉树中每个节点除了左右孩子节点指针外,还有一个next指针。
请完成一个函数,实现将每个节点的next指针指向同一层中的右边一个节点。若右边没有节点,则指向NULL
示例:
分析:
这一题的做法与上一题基本相同,同样利用队列这一数据结构。不过我们可以在每一层遍历完后向队列中加入一个NULL指针,用于标识这一层的所有节点已经全部遍历完
代码:
void connect(TreeLinkNode *root) {
if(root==NULL) return;
queue<TreeLinkNode *> q;
q.push(root);
q.push(NULL);
TreeLinkNode *head=NULL;
while(!q.empty()){
TreeLinkNode *t=q.front();
q.pop();
if(t){
if(t->left)
q.push(t->left);
if(t->right)
q.push(t->right);
}else{
if(!q.empty())
q.push(NULL); //为每一层的末尾加入一个NULL节点
}
if(head){
head->next=t; //给每个节点的next指针赋值
head=head->next;
}else{
head=t;
}
}
}