版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XUCHEN1230/article/details/84036565
不同于中序、前序、和后续遍历使用栈,层序遍历使用的是队列!
代码如下:
void level_order(tree_pointer ptr){
int front = rear = 0;
tree_pointer queue[MAX_QUEUE_SIZE];
if(!ptr) return ; /* empty tree*/
addq(front, &rear, ptr);
while(1){
ptr = deleteq(&rear, ptr);
if(ptr) {
printf("%d",ptr -> data);
if(ptr->left_child)
addq(front, &rear, ptr->left_child);
if(ptr->right_child)
addq(front, &rear, ptr->right_child);
}
//addq是循环队列插入函数:
void addq(int front, int *rear, tree_pointer ptr){
*rear = (*rear+1) % MAX_QUEUE_SIZE;
if(front == *rear){
queue_full(rear);
reutrn ;
}
queue[*rear] = item;
}
//deleteq 是循环队列删除
element deleteq(int *front, int rear){
element item;
if(*front == rear)
return queue_empty();
*front = (*front+1) % MAX_QUEUE_SIZE;
reutrn queue[*front];
}
层序遍历如何与二叉树深度结合:
在层序遍历中,不使用循环队列而使用普通队列也是可以的。
分析代码:
void level_order(tree_pointer ptr){
int front = rear = 0;
tree_pointer queue[MAX_QUEUE_SIZE];
if(!ptr) return ; /* empty tree*/
addq(front, &rear, ptr); //先将二叉树的头结点放入队列中,此时队列中只存在一个结点;
while(1){
ptr = deleteq(&rear, ptr); //输出存储的结点,然后对其左右儿子进行操作;
if(ptr) {
printf("%d",ptr -> data);
if(ptr->left_child) //若左儿子不为空则左儿子入列;
addq(front, &rear, ptr->left_child);
if(ptr->right_child) //若右儿子不为空则右儿子也入列;
addq(front, &rear, ptr->right_child);
}
/*
根据上述代码分析可知:
层序遍历是分别将每一层的结点放入队列进行操作,若要放入下一层则访问这一层结点的左右儿子。
*/
所以可以利用这个特点,在放入下一层结点时,对深度depth进行累加。
此时需要判断这一层的结点是否全部操作完,此时就要对已入列的size进行判断。
代码如下:
int Depth(TreeNode* head,int &depth){
if (head == nullptr) return 0;
int depth = 0;
queue<TreeNode*> que;
que.push(head);
while (!que.empty()) {
depth++;
int count = 0;
int size = que.size();
while (count < size) { //弹出当前层的所有节点
TreeNode *front = que.front();
que.pop();
count++;
if (front->left)
que.push(front->left);
if (front->right)
que.push(front->right);
}
}
return depth;
}
//参考文献:数据结构(C语言版)---机械工业出版社