树的层序遍历
层序遍历:顾名思义一层一层的进行遍历,所以,树的层序遍历就是从上到下,从左到右依次进行遍历。
例如上图二叉树的层序遍历就是:1 4 2 7 20 5。二叉树层序遍历的代码一般要通过队列来实现。附上c++代码,利用队列queue作为容器。
// 0. 声明队列
queue<TreeNode*> q;
// 1. 将根节点加入队列
q.push(root);
// 2. 遍历队列中每个节点
while(!q.empty()) {
TreeNode* cur = q.front();
q.pop();
// 3. 记录当前节点值
vec.push(cur->val);
// 4. 将左右孩子放入队列
q.push(cur->left);
q.push(cur->right);
}
其实说到这里,层序遍历的代码就很容易理解了,由于层序遍历是每一层每一层的进行遍历,所以根据二叉树根节点先入队,代表着第一层遍历完毕,然后将他的左右孩子依次入队,然后再根据左右的顺序将它们的孩子入队,每处理完一个节点就将他出队。
如下示意图:
例题:以二叉链表作为二叉树的存储结构,编写用层次顺序遍历二叉树的方法,统计树中度为1 的结点个数。
代码:
void out(struct node* tree)
{
struct node **que=(struct node**)malloc(sizeof(struct node*));
int head=0,tail=0;
int i,j;
if(tree==NULL) return;
que[tail++]=tree;
while(head<tail)
{
int size=tail-head;
for(i=0;i<size;i++)
{
struct node* cur=que[head++];
if(cur->left==NULL&&cur->right!=NULL) count++;
if(cur->left!=NULL&&cur->right==NULL) count++;
if(cur->left!=NULL) que[tail]=cur->left;
if(cur->right!=NULL) que[tail++]=cur->right;
}
}
printf("%d",count);
}