码迷,mamicode.com
首页 > 编程语言 > 详细

第六章 二叉树【算法入门经典】【结构体指针】

时间:2017-11-09 22:49:10      阅读:350      评论:0      收藏:0      [点我收藏+]

标签:一个   实现   效果图   char   ima   read   技术   image   logs   

技术分享

运行效果图 结构体指针实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 10000
int failed,n,v,ans[N];
char s[N];//保存读入结点 
typedef struct Node//结点类型 
{
	int flag;//是否被赋值过 
	int number;//结点值 
	struct Node *left,*right;//左右子结点 
}Node;
Node *root,*q[N];
Node* newnode()
{
	Node *u;
	u = (Node*)malloc(sizeof(Node));
	if(u!=NULL)
	{
		u->flag = 0; 
		u->left = u->right = NULL;//初始时没有左右儿子 
	}
	return u;
}
int addnode(int v,char *str)
{
	int l = strlen(str);
	Node *u = root;
	for(int i = 0; i < l; i ++)//根结点开始往下走 
	{
		if(str[i] == ‘L‘)
		{
			if(u->left == NULL)
				u->left = newnode();//结点不存在,建立新结点 
			u = u->left ;//往左走 
		}
		else if(str[i] == ‘R‘)
		{
			if(u->right == NULL)
				u->right = newnode();
			u = u->right ;
		}
	}
	if(u->flag)//如果最后结束的括号也被标记为用过了,说明输入有误 
		failed = 1;
	u->number = v;
	u->flag = 1;//标记为已经用过 
	return 1;
}
void read_input()
{
	root = newnode();//创建根结点 
	failed = 0;//记录输入是否有误 
	while(scanf("%s",s),strcmp(s,"()")!=0)
	{
		sscanf(&s[1],"%d",&v);//读入结点值 
		addnode(v,strchr(s,‘,‘)+1);//查找逗号,然后插入结点 
	}
	return ;
}
int bfs()
{
	int front = 0,rear = 1,v;
	q[0] = root;//初始时只有一个根结点 
	n = 0;
	while(front < rear)
	{
		Node* u =  q[front++]; 
		if(!u->flag)
			return 0;//有结点没有被赋值过,表明输入有误 
		ans[n++] = u->number ;//增加到输出序列尾部 
		if(u->left != NULL)
			q[rear++] = u->left ;//如果有,把左儿子放进队列 
		if(u->right != NULL)
			q[rear++] = u->right ;//把右儿子放进队列 
	}
	return 1;
}

int main()
{
	read_input();
	if(failed||!bfs())
		printf("-1\n");
	else
	{
		for(int i = 0; i < n-1; i ++)
			printf("%d ",ans[i]);
		printf("%d\n",ans[n-1]);
	}
	return 0;
}

  

第六章 二叉树【算法入门经典】【结构体指针】

标签:一个   实现   效果图   char   ima   read   技术   image   logs   

原文地址:http://www.cnblogs.com/chengdongni/p/7811204.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!