1. 程式人生 > >c語言實現 非遞歸先序遍歷二叉鏈樹

c語言實現 非遞歸先序遍歷二叉鏈樹

停止 數據 節點 一個 null front getchar() getc 輸入

 1 #include<stdio.h>
 2 #include<conio.h>
 3 #include<malloc.h>
 4 typedef char datatype;
 5 typedef struct node{      
 6     datatype data;
 7     struct node *lchild,*rchild;
 8 }bitree;                     //二叉鏈樹數據結構定義
 9 void Preorder(bitree *p)     //先序遍歷算法
10 {
11     bitree *Stack[100
]; //用一個“棧數組”存放二叉樹節點bitree指針,假定最多能盛放100個bitree節點 12 bitree *s=p; //s節點為當前節點 13 int top=-1; 14 while(top!=-1||s!=NULL)
    {

      while(s!=NULL)
      {
16 if(top==99)
         { //棧滿,上溢出提示
17 printf("overflow"); 18 return
; 19 } 20 else
         { 21 top++; //當前節點入棧,並且訪問(打印內容) 22 Stack[top]=s; 23 printf("%c",s->data); 24 s=s->lchild; //先序要求先訪問左孩子,為空時跳出循環 25 } 26 } 27 s=Stack[top]; //s回到當前空左孩子的雙親節點 28
top--; //退棧 29 s=s->rchild; //遍歷右孩子 30 } 31 } 32 bitree *CreatTree(){ //建立二叉鏈樹的函數,從左到右,從上到下依次賦值,空值給‘@’,退出在結尾給‘@’ 33 char ch; 34 bitree *Q[100]; //建立一個“隊列數組”存放bitree指針節點 35 int front,rear; 36 bitree *root,*s; //root是根節點,s還是代表當前建立的節點 37 root=NULL; //頭結點置空 38 front=1,rear=0; 39 while((ch=getchar())!=#) //定義輸入‘#’符號表示停止輸入節點元素,建立結束 40 { 41 s=NULL; 42 if(ch!=@){ //定義輸入‘@’符號表示輸入的樹節點為空 43 s=(bitree*)malloc(sizeof(bitree)); 44 s->data=ch; 45 s->lchild=NULL; 46 s->rchild=NULL; 47 } 48 rear++;       //當前節點建立完成後入隊 49 Q[rear]=s;   50 if(rear==1) 51 root=s; 52 else{ 53 if(s&&Q[front]){ 54 if(rear%2==0) //左孩子節點編號為偶數 55 Q[front]->lchild=s; 56 else      //右孩子節點編號為奇數 57 Q[front]->rchild=s; 58 } 59 if(rear%2==1)  //雙親節點右孩子建立結束後,雙親節點出隊,建立下一位緊鄰的雙親節點的孩子 60 front++; 61 } 62 } 63 return root; //函數返回建立完成的二叉鏈樹的根節點指針 64 } 65 int main() 66 { 67 bitree *root; 68 root=CreatTree(); 69 Preorder(root); 70 return 0; 71 }

c語言實現 非遞歸先序遍歷二叉鏈樹