輸入一顆二元樹,從上往下按層打印樹的每一個節點,同一層按照從左往右的順序打印。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; }