二叉树(周五实验)
1 #include <iostream> 2 #include<fstream> 3 using namespace std; 4 5 typedef struct TreeNode 6 { 7 char data; 8 int level; 9 TreeNode* lchid; 10 TreeNode* rchid; 11 }TreeNode; 12 13 char arr[20][2];//存放结点信息 14 bool visited[20]={0};//标记是否访问 15 int numlevel[20]={0}; 16 int sum=1;//文件总行数加一 17 18 typedef struct StackNode 19 { 20 TreeNode* data; 21 StackNode* next; 22 }StackNode; 23 24 typedef struct QueueNode 25 { 26 TreeNode* data; 27 QueueNode* next; 28 QueueNode* pre; 29 }QueueNode; 30 31 QueueNode* initQueue() 32 { 33 QueueNode* Q = (QueueNode*)malloc(sizeof(QueueNode)); 34 Q->data = NULL; 35 Q->next = Q; 36 Q->pre = Q; 37 return Q; 38 } 39 40 void enQueue(QueueNode* Q,TreeNode*T) 41 { 42 QueueNode* node = (QueueNode*)malloc(sizeof(QueueNode)); 43 node->data = T; 44 45 node->next = Q; 46 node->pre = Q->pre; 47 Q->pre->next = node; 48 Q->pre = node; 49 } 50 51 bool isEmptyQ(QueueNode* Q) 52 { 53 if (Q->next == Q) 54 return true; 55 return false; 56 } 57 58 QueueNode* deQueue(QueueNode* Q) 59 { 60 if (isEmptyQ(Q) == true) 61 return NULL; 62 QueueNode* node = Q->next; 63 64 Q->next->next->pre = Q; 65 Q->next = Q->next->next; 66 return node; 67 } 68 69 StackNode* initStack() 70 { 71 StackNode* S = (StackNode*)malloc(sizeof(StackNode)); 72 S->data = NULL; 73 S->next = NULL; 74 return S; 75 } 76 77 void Push(TreeNode* data, StackNode* S) 78 { 79 StackNode* node = (StackNode*)malloc(sizeof(StackNode)); 80 node->data = data; 81 node->next = S->next; 82 S->next = node; 83 } 84 85 int isEmptyS(StackNode* S) 86 { 87 if (S->next == NULL) 88 return 1; 89 return 0; 90 } 91 92 StackNode* Pop(StackNode* S) 93 { 94 if (isEmptyS(S)) 95 return NULL; 96 StackNode* node = S->next; 97 S->next = node->next; 98 return node; 99 } 100 101 StackNode* GetPop(StackNode* S) 102 { 103 if (isEmptyS(S)) 104 return NULL; 105 StackNode* node = S->next; 106 return node; 107 } 108 109 int SearchChild(int place) 110 { 111 for (int i = 1; i < sum; i++) 112 { 113 //该节点未访问并且父亲等于搜索的结点 114 if (visited[i] == 0 && arr[i][2] == arr[place][1]) 115 return i; 116 } 117 return -1; 118 } 119 120 void CreateTreeNode(TreeNode** T,int place,int pos) 121 { 122 //没有该结点 123 if (place == -1) 124 (*T) = NULL; 125 else 126 { 127 visited[place] = 1; 128 //标记已经访问,防止多次访问 129 130 char ch = arr[place][1]; 131 (*T) = (TreeNode*)malloc(sizeof(TreeNode)); 132 (*T)->data = ch; 133 (*T)->level = pos; 134 135 pos++; 136 137 //寻找左孩子 138 int nextplace1 = SearchChild(place); 139 CreateTreeNode(&(*T)->lchid, nextplace1,pos); 140 //寻找右孩子 141 int nextplace2 = SearchChild(place); 142 CreateTreeNode(&(*T)->rchid, nextplace2,pos); 143 } 144 145 } 146 147 //先序遍历(递归) 148 void preOrderFun(TreeNode* T) 149 { 150 if (T == NULL) 151 return; 152 else 153 { 154 //输出节点 155 cout << T->data << " "; 156 //左孩子 157 preOrderFun(T->lchid); 158 //右孩子 159 preOrderFun(T->rchid); 160 } 161 } 162 163 //中序遍历非递归 164 void inOrder(TreeNode* T) 165 { 166 TreeNode* node = T; 167 StackNode* S = initStack(); 168 while (node||!isEmptyS(S)) 169 { 170 if (node) 171 { 172 Push(node, S); 173 node = node->lchid; 174 } 175 else 176 { 177 node = Pop(S)->data; 178 cout << node->data << " "; 179 node = node->rchid; 180 } 181 } 182 } 183 184 void LevelNumber(TreeNode* T,QueueNode*Q) 185 { 186 enQueue(Q, T); 187 while (!isEmptyQ(Q)) 188 { 189 QueueNode* node = deQueue(Q); 190 numlevel[node->data->level]++; 191 if (node->data->lchid) 192 enQueue( Q,node->data->lchid); 193 if (node->data->rchid) 194 enQueue(Q, node->data->rchid); 195 } 196 } 197 198 int main() 199 { 200 fstream fp; 201 fp.open("text.txt", ios::in); 202 if (!fp)return 0; 203 204 int place = 0;//找寻根节点 205 while (!fp.eof()) 206 { 207 fp >> arr[sum][1] >> arr[sum][2]; 208 if (arr[sum][1] == arr[sum][2]&&arr[sum][1]!='\0') 209 place = sum; 210 sum++; 211 } 212 213 int pos = 1;//层次 214 215 TreeNode* T; 216 CreateTreeNode(&T, place,pos); 217 218 cout << "先序遍历:" << endl; 219 preOrderFun(T); 220 cout << endl; 221 222 cout << "中序遍历:" << endl; 223 inOrder(T); 224 cout << endl; 225 226 QueueNode* Q = initQueue(); 227 LevelNumber(T,Q); 228 int i = 1; 229 while (numlevel[i] != 0) 230 { 231 cout << numlevel[i] << endl; 232 i++; 233 } 234 }