二叉树的层次遍历

题目描述

输入一棵二叉树,你的任务是按从上到下、从左到右的顺序输出各个结点的值。每个结点都按照从根结点到它的移动序列给出(L代表左,R代表右)。在输入中,每个结点的左括号和右括号之间没有空格,相邻结点之间用一个空格隔开。每棵树的输入用一对空括号"()"结束(这对括号本身不代表一个结点)。

注意,如果从根节点到某个叶节点的路径上有的结点没有在输入中给出,或者给出超过一次,应当输出-1。结点个数不超过256。

样例输入

(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()

(3,L) (4,R) ()

样例输出

5 4 8 11 13 4 7 2 1

-1

解题思路

这个题看题目的要求是要用二叉树的层次遍历实现的,这就要运用到数据结构二叉树以及层次遍历(队列以及广度搜索)。

 

下面以c为例,给出代码(分块代码进行解释):

首先是树:

typedef struct Node {//构造树的结点
	int boolean; //判断该节点是否有被赋值
	int data;//结点数据
	struct Node *left, *right; //左右子树
}Node;

Node * new_Tree_Node() //创建新结点
{
	Node* root;
	root = (Node *)malloc(sizeof(Node));
	root->boolean = 0; //没被赋值
	root->left = NULL;
	root->right = NULL;
	return root;
}

void add_Tree_Node(Node* root, int data, char *s) //给树添加结点
{
	Node *tree = root;
	int i = 0;
	for (i = 0; s[i] != ')'; i++)
	{
		if (s[i] == 'L') { //如果向左走
			if (tree->left == NULL) //如果左子树为空
				tree->left = new_Tree_Node(); //创建结点
			tree = tree->left;
		}
		else { //向右走
			if (tree->right == NULL) //如果右子树为空
				tree->right = new_Tree_Node(); //创建结点
			tree = tree->right;
		}
	}
	tree->boolean = 1;
	tree->data = data;
}

 然后是队列的实现

//构建队列
typedef struct qnode {
	Node * data;
	struct qnode *next;
}QNode;

typedef struct queue {
	QNode *front;
	QNode *rear;
}Queue;

void push_QNode(Node *data,Queue *q){
	if (q->rear != NULL) {
		QNode* node = (QNode*)malloc(sizeof(QNode));
		node->data = data;
		q->rear->next = node;
		q->rear = q->rear->next;
		q->rear->next = NULL;
	}
}

void pop_QNode(Queue *q) {
	if (q->front != NULL)
		q->front = q->front->next;
}

接下来是广度搜索算法的实现(简单来说就是不断把结点入列直到所有结点处理完为止)

char bfs(QNode* root,int *s)
{
	char c = 'T';
	Queue* q = (Queue *)malloc(sizeof(Queue));
	q->front = root;
	q->rear = root;
	int i = 0;
	while (q->front != NULL)
	{
		QNode* node = q->front;
		if (node->data->boolean == 0)
		{
			c = 'N';
			break;
		}
		s[i++] = node->data->data; //储存数据
		if (node->data->left != NULL)//如果左子树不为空,入列
			push_QNode(node->data->left, q);
		if (node->data->right != NULL)//如果右子树不为空,入列
			push_QNode(node->data->right, q);
		pop_QNode(q);
	}
	return c;
}

主方法:

int main()
{
	char s[256][256];
	while (scanf("%s",s[0]))
	{
		//处理输入数据
		int sCount = 1;
		while (1) {
			scanf("%s", s[sCount]);
			if (strcmp(s[sCount],"()") == 0)
				break;
			sCount++;
		}

		Node* root = new_Tree_Node(); //创建根结点

		for (int j = 0; j < sCount; j++) //遍历每一组数据
		{
			int num = 0, k = 0;
			for (k = 1; s[j][k] != ','; k++) //把字符串前半部分转为数字
				num = num * 10 + s[j][k] - '0';
			
			char LR[256]; 
			int index = 0;
			for (int o = k + 1; s[j][o] != '\0'; o++)
				LR[index++] = s[j][o];
			LR[index] = '\0';

			add_Tree_Node(root, num, LR);//构建树
		}

		//层次遍历
		int data[256];
		QNode* q = (QNode *)malloc(sizeof(QNode));//先建一个队列
		q->data = root;
		q->next = NULL;
		char judge = bfs(q, data);

		//输出
		if (judge == 'T')
			for (int i = 0; i < sCount; i++)
				printf("%d ", data[i]);
		else
			printf("-1");
		printf("\n");
	}
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值