您的位置:首页 > 其它

PAT 03-树1. List Leaves (25)(C)

2015-04-15 13:08 435 查看
最近在MOOC上学数据结构,作为一个非计算机学生,说起来有些吃力,进度很慢,有时候两天做一道PAT习题。遇到没思路的问题网上查询几乎都是C++的算法代码,C++由于其富含各种遍历的库函数使得代码非常简短,但是没学过C++的同学就完全看不懂stl函数了,这篇文章为了那些只会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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c