PAT 03-树1. List Leaves (25)(C)
2015-04-15 13:08
435 查看
最近在MOOC上学数据结构,作为一个非计算机学生,说起来有些吃力,进度很慢,有时候两天做一道PAT习题。遇到没思路的问题网上查询几乎都是C++的算法代码,C++由于其富含各种遍历的库函数使得代码非常简短,但是没学过C++的同学就完全看不懂stl函数了,这篇文章为了那些只会C也在学习的朋友。以后也会继续更新解题报告,大家一起学习吧
代码中vector是C++中一个非常好用的容器,用来动态建立数组,防止空间浪费。
以下附上题目和源码
代码中vector是C++中一个非常好用的容器,用来动态建立数组,防止空间浪费。
以下附上题目和源码
#include<iostream> #include<vector> using namespace std; #define MaxSize 10 typedef int ElementType; typedef struct TreeNode *BinTree; typedef BinTree Position; struct TreeNode { ElementType data; BinTree left; BinTree right; }; typedef struct Node{ struct TreeNode node[MaxSize]; int front; int rear; }*Queue; int final_data[MaxSize]; void AddQ(Queue Q, BinTree BT); BinTree DeleteQ(Queue Q); void LevelOrderTraversal(BinTree BT); int main(int argc, char *argv[]) { int n; cin >> n; vector<vector<char> >tree_data(n, vector<char>(2)); //用vector建立变长二维数组,节省空间 vector<int>index(n); //index数组用来寻找根结点 //树结点数据输入 for (int i = 0; i < n; i++) { for (int j = 0; j < 2; j++) { char num; cin >> num; tree_data[i][j] = num; int t; t = tree_data[i][j] - '0'; if (t>=0) { index[t] = 1; } } } //找根结点 BinTree root; root = (BinTree)malloc(sizeof(struct TreeNode)); root->left = NULL; root->right = NULL; for (int i = 0; i < n; i++) { if (!index[i]) { root->data = i; break; } } /************建立树************/ struct TreeNode *tree = new struct TreeNode ; for (int i = 0; i < n; i++) { tree[i].data = i; if (tree_data[i][0] != '-') { tree[i].left = &tree[tree_data[i][0] - '0']; //将结点相互连起来 } else tree[i].left = NULL; if (tree_data[i][1] != '-') { tree[i].right = &tree[tree_data[i][1] - '0']; } else tree[i].right = NULL; } for (int i = 0; i < n; i++) { if (root->data == tree[i].data) { root = &tree[i]; break; } } //层序遍历 LevelOrderTraversal(root); return 0; } void LevelOrderTraversal(BinTree BT) { Queue Q; Q = (Queue)malloc(sizeof(struct Node)); Q->front = Q->rear = 0; BinTree T; if (!BT) return; int i = 0; AddQ(Q,BT); //根结点入队 while (Q->front != Q->rear) //队列不为空 { int flagl = 0; int flagr = 0; T = DeleteQ(Q); if (T->left) AddQ(Q, T->left); else flagl = 1; if (T->right) AddQ(Q, T->right); else flagr = 1; if (flagl&&flagr) { final_data[i] = T->data; i++; } } int k = i; for (int i = 0; i < k; i++) { if (i == k - 1) cout << final_data[i] << endl; else cout << final_data[i] << ' '; } } void AddQ(Queue Q, BinTree BT) { Q->node[Q->rear] = *BT; (Q->rear)++; } BinTree DeleteQ(Queue Q) { BinTree T; T = &(Q->node[Q->front]); Q->front++; return T; }
相关文章推荐
- PAT 03-2. List Leaves (25)
- PAT : 03-树1. List Leaves (25)
- PAT 03-2. List Leaves (25)
- PAT 数据结构 03-树2. List Leaves (25)
- 【解题报告】【浙大PAT】03-树1. List Leaves (25)
- 03-2. List Leaves (PAT) - 二叉树层序遍历问题
- 03-树2. List Leaves (25) 二叉树的层序遍历
- 03-树1. List Leaves (25)
- 03-树1. List Leaves (25)
- pat 03-树2 List Leaves(mooc 陈越、何钦铭-数据结构)
- 03-树1. List Leaves (25)
- 03-2. List Leaves (25)--c语言实现
- 03-树1. List Leaves (25)
- 03-2. List Leaves (25) 树的层次遍历
- 03-树2. List Leaves (25)
- 03-树1. List Leaves (25)
- 03-树2. List Leaves (25) Java
- 03-2. List Leaves (25)
- 03-树2. List Leaves (25) Python C
- 03-树1. List Leaves (25)