大二這么久了,第一個學期課程實在太少,而且全都不是CS的專業課,無奈,若是自己不勤奮一點,過了半年,用不到半年,就又變回小白了。所以自己最近也在重新鞏固數據結構的知識。剛好看到二叉樹這里,覺得二叉樹應用廣泛,復習的比較細致。
剛開始就是二叉樹的建立了,大多數地方都是先序的遞歸創建,於是便想着試試非遞歸的代碼,倒騰了個把小時,基本上弄出代碼了,本渣渣水平有限,有錯誤的地方,望路過的大神不吝賜教~~不勝感激!
主要的思路是:
按照先序的順序輸入二叉樹,若是遇到空子樹,用字符‘#‘表示,例如


( 1)若第一次輸入就是’#‘,則創建的是空樹。
(2)每次創建一個新的結點p,看棧頂元素的flag,若為0,則取出(不出棧)棧頂指針R,並將其flag修改為1.R->child=p;
若flag本身就是1,則直接取棧頂(出棧)!R-rchild=p;
然后將p入棧。入棧的flag初始值是0;
(3)當棧為空時,二叉樹就建好了。
代碼:
1 #include<stdio.h> 2 #include<iostream> 3 #include<malloc.h> 4 using namespace std; 5 typedef struct BiTNode 6 { 7 char c; 8 struct BiTNode *lchild,*rchild; 9 }BiTNode,*BiTree; 10 typedef struct 11 { 12 BiTree x; 13 int flag; 14 }snode; 15 typedef struct 16 { 17 snode sdata[100]; 18 int top; 19 }Stack; 20 int Empty(Stack s) 21 { 22 if(s.top==-1) return 1; 23 else return 0; 24 } 25 void Pop(Stack &s,BiTree R) //取棧頂元素,flag=1標志已經被取過一次 26 { 27 R=s.sdata[s.top].x; 28 s.sdata[s.top].flag=1; 29 } 30 void Out(Stack &s,BiTree R) //取棧頂元素,並且棧頂元素出棧 31 { 32 R=s.sdata[s.top].x; 33 s.top--; 34 } 35 void In(Stack &s,BiTree R) //指針入棧,flag=0標志從未被取過 36 { 37 s.top++; 38 s.sdata[s.top].x=R; 39 s.sdata[s.top].flag=0; 40 } 41 void CreateBiTree(BiTree T) 42 { 43 char ch; 44 Stack s; 45 T=NULL; 46 s.top=-1; 47 BiTree R=T,p; 48 do 49 { 50 cin>>ch; 51 if(Empty(s)&&ch=='#') 52 return; 53 else if(ch!='#') 54 { 55 p=(BiTree)malloc(sizeof(BiTNode)); 56 p->c=ch; 57 if(Empty(s)) 58 { 59 T=p; 60 R=p; 61 } 62 else if(s.sdata[s.top].flag==0) 63 { 64 Pop(s,R); 65 R->lchild=p; 66 } 67 else 68 { 69 Out(s,R); 70 R->rchild=p; 71 } 72 In(s,p); 73 } 74 else 75 { 76 if(s.sdata[s.top].flag==0) 77 { 78 Pop(s,R); 79 80 R->lchild=NULL; 81 } 82 else 83 { 84 Out(s,R); 85 R->rchild=NULL; 86 } 87 } 88 }while(s.top!=-1); 89 } 90 int main() 91 { 92 BiTree T; 93 CreateBiTree(T); 94 }
