我建了兩個棧,每次遍歷一個層次之後就換一個棧,我只想到了這種方法,但感受這作法不是很好。node
1 /* 2 假設二叉樹採用鏈式方式存儲,t爲其根結點,編寫一個函數int Depth(bintree t, char x),求值爲x的結點在二叉樹中的層次。 3 */ 4 #include "bintree.h" 5 char *a="ABC##D##EF#G###"; /*擴充二叉樹序樹t的前序序列*/ 6 7 /* 8 函數Depth,功能:求結點x所在的層次 9 */ 10 int Depth(bintree t,char x) 11 { 12 int k=1,flag=1; 13 binnode *p=t; 14 binnode *q; 15 seqstack L1,L2; 16 init(&L1); 17 init(&L2); 18 push(&L1,p); 19 while(1) 20 { 21 if(flag==1) 22 { 23 while(!empty(&L1)) 24 { 25 q=pop(&L1); 26 if(q->data==x) return k; 27 if(q->lchild!=NULL) push(&L2,q->lchild); 28 if(q->rchild!=NULL) push(&L2,q->rchild); 29 } 30 k++; 31 flag=0; 32 } 33 else if(flag==0) 34 { 35 while(!empty(&L2)) 36 { 37 q=pop(&L2); 38 if(q->data==x) return k; 39 if(q->lchild!=NULL) push(&L1,q->lchild); 40 if(q->rchild!=NULL) push(&L1,q->rchild); 41 } 42 k++; 43 flag=1; 44 } 45 } 46 } 47 48 int main() 49 { bintree root; 50 char x; 51 int k=0; 52 root=creatbintree(); 53 printf("請輸入樹中的1個結點值:\n"); 54 scanf("%c",&x); 55 k=Depth(root,x); 56 printf("%c結點的層次爲%d\n",x,k); 57 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define N 100 4 extern char *a; /*存放擴充二叉樹的前序序列*/ 5 typedef struct node /*二叉樹結構定義*/ 6 { 7 char data; 8 struct node *lchild,*rchild; 9 }binnode; 10 typedef binnode *bintree; 11 12 /*函數creatbintree (根據擴充二叉樹的前序序列(字符串a)創建二叉樹t的存儲結構*/ 13 bintree creatbintree() 14 { 15 char ch=*a++; 16 bintree t; 17 if (ch=='#') t=NULL; 18 else 19 { t=(bintree)malloc(sizeof(binnode)); 20 t->data=ch; 21 t->lchild=creatbintree(); 22 t->rchild=creatbintree(); 23 } 24 return t; 25 } 26 27 void preorder(bintree t) /*前序遞歸遍歷二叉樹*/ 28 { 29 if (t) 30 { 31 printf("%c",t->data); 32 preorder(t->lchild); 33 preorder(t->rchild); 34 } 35 } 36 void postorder(bintree t) /*後序遞歸遍歷二叉樹*/ 37 { 38 if (t) 39 { 40 41 postorder(t->lchild); 42 postorder(t->rchild); 43 printf("%c",t->data); 44 } 45 } 46 47 /*順序棧定義*/ 48 typedef struct 49 { 50 bintree data[N]; 51 int top; 52 int tag[N]; 53 }seqstack; 54 55 void init(seqstack *s) /*初始化空棧*/ 56 { 57 s->top=-1; 58 } 59 int empty(seqstack *s) /*判斷棧是否爲空*/ 60 { 61 if (s->top>-1) return 0; 62 else return 1; 63 } 64 int full(seqstack *s) /*判斷棧是否爲滿*/ 65 { 66 if (s->top==N-1) return 1; 67 else return 0; 68 } 69 void push(seqstack *s ,bintree x) /*進棧*/ 70 { 71 if (!full(s)) 72 s->data[++s->top]=x; 73 } 74 bintree pop(seqstack *s) /*出棧*/ 75 { 76 if (!empty(s)) 77 return s->data[s->top--]; 78 }