1. 程式人生 > >二叉樹按層遍歷----非遞迴實現

二叉樹按層遍歷----非遞迴實現

演算法思路

用佇列儲存左右子女的地址。當從佇列中拿出一個節點時,將這個節點的左右子女的地址也放到佇列中

程式碼

#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; }