输入一颗二元树,从上往下按层打印树的每一个节点,同一层按照从左往右的顺序打印。node
8数组
/ /spa
6 103d
/ / / /code
5 7 9 11排序
8 6 10 5 7 9 11队列
把一颗二叉树抽象成三个节点:根节点、左节点、右节点。
io
先序遍历便可获得按行输出的效果。
编译
对于左子树只要保存其根节点,既保存了整个左子树。(右子树同样)
class
对于根节点以外的两个子树来讲说,始终是先访问左子树的根节点,再访问右子树的根节点。
所以能够使用队列存储。
#include "stdio.h" #include "stdlib.h" //二叉树节点 #define size 7 //二叉树节点定义 typedef struct node { int data; struct node *left; struct node *right; }BTree; int printLine(BTree * root); BTree * CreatTree(int a[],int n); int main(void) { int array[size] = {8,6,10,5,7,9,11}; BTree * root; root = CreatTree(array,size); printLine(root); printf("\n"); return 0; } int printLine(BTree * root) { BTree * queue[size], *p; int front,rear; front = rear = 0; rear = (rear+1)%size; queue[rear] = root; //循环结束为队列为空 while(front != rear) { //根出队列 front = (front +1)%size; p = queue[front]; printf("%3d",p->data); //左孩子不空,队不满入队 if(p->left && ((rear+1)%size != front)) { rear = (rear+1)%size; queue[rear] = p->left; } //右孩子不空,队不满入队 if(p->right && ((rear+1)%size != front)) { rear = (rear+1)%size; queue[rear] = p->right; } //队满,报错 if((rear+1)%size == front) { printf("队列空间不足,错误....\n"); return 0; } } return 1; } //根据数组建立二叉排序树 BTree * CreatTree(int a[],int n) { BTree * root ,*p,*cu,*pa; int i; root = (BTree *)malloc(sizeof(BTree)); root->data = a[0]; root->left = root->right =NULL; for(i=1;i<n;i++) { p = (BTree *)malloc(sizeof(BTree)); p->data = a[i]; p->left = p->right =NULL; cu = root; while(cu) { pa = cu; if(cu->data > p->data) cu = cu->left; else cu = cu->right; } if(pa->data > p->data) pa->left = p; else pa->right = p; } return root; }