二叉樹按層遍歷----非遞迴實現
阿新 • • 發佈:2019-02-13
演算法思路
用佇列儲存左右子女的地址。當從佇列中拿出一個節點時,將這個節點的左右子女的地址也放到佇列中
程式碼
#include <stdio.h>
#include <stdlib.h>
//二叉樹節點的結構
typedef struct node{
int data;//儲存節點的值
struct node *left,*right;//指向二叉樹的左右節點的指標
}BTNode;
//建立一顆二叉查詢樹(右子女比左子女大)
BTNode *CreateBTNode(int a[],int n)
{
BTNode *root,*pa,*c,*p;
//建立根節點
root = (BTNode *)malloc(sizeof(BTNode));
root->data=a[0];
root->right=root->left=NULL;
int i;
for(i=1;i<n;i++)
{
p=(BTNode *)malloc(sizeof(BTNode));
p->data=a[i];
p->right=p->left=NULL;
c=root;
while(c)
{
pa=c;
if (c->data > p->data)
{
c=c->left;
}else{
c=c->right;
}
}
if(pa->data > p->data)
{
pa->left=p;
}else{
pa->right=p;
}
}
return root;
}
//按層遍歷
void Level_order(BTNode *root,int n){
BTNode **Q;//佇列指標
BTNode *p;
int front,rear;//隊首指標,隊尾指標
front = rear =-1;
Q = (BTNode **)malloc((n+1)*sizeof(BTNode *));//申明佇列空間
Q[++rear] = root;//根節點首先儲存到佇列
//當佇列為空的時候,則遍歷結束
while (front != rear){
p = Q[++front];
printf("%d\t",p->data);
//將左右子女的地址存入佇列
if (p->left){
Q[++rear] = p->left;
}
if (p->right) {
Q[++rear] = p->right;
}
}
free(Q);
}
int main(void){
BTNode *root;
int data[10] = {3,2,5,8,4,7,6,9,0,1};
//建立二叉查詢樹
root = CreateBTNode(data,10);
//按層遍歷
Level_order(root,10);
return 0;
}