二叉树学习——简单入门题

入门题一:

输入一颗二叉树。你的任务是按从上到下、从左到右的顺序输出各个节点的值。每一个节点都依照从根节点到它的移动序列给出

(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

0

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define maxn 256

char buf[maxn];	//保存读入节点
int failed;
int n=0,ans[maxn];	//节点个数和输出序列 

typedef struct Tnode{
	int have_value;	//是有赋过值
	int v;			//节点值
	struct Tnode *left,*right;
}Node;
Node *root;	//二叉树的根节点 

Node* newnode()
{
	Node *tmp=(Node*)malloc(sizeof(Node));
	if(tmp!=NULL)
	{
		tmp->have_value=0;		//显示的初始化为0,由于malloc申请内存时并不把它清零
		tmp->left=tmp->right=NULL;
	}
	return tmp;
}

void addnode(int value,char *s)
{
	int length=strlen(s);
	Node *tmp=root;
	for(int i=0;i<length;i++){	//索引相应的位置
		if(‘L‘==s[i])
		{
			if(NULL==tmp->left) tmp->left=newnode();
			tmp=tmp->left;
		}else if(‘R‘==s[i]){
			if(NULL==tmp->right) tmp->right=newnode();
			tmp=tmp->right;
		}
	}
	if(tmp->have_value) failed=1;	//已经赋过值表明输入有误
	tmp->v=value;	tmp->have_value=1;
}

int read_input()
{
	failed=0;
	root=newnode();
	for(;;)
	{
		if(scanf("%s",buf)!=1) return 0;	//整个输入结束
		if(!strcmp(buf,"()")) break;
		int v;
		sscanf(&buf[1],"%d",&v);	//读入节点的值
		addnode(v,strchr(buf,‘,‘)+1);
	}
	return 1;
} 

/*  BFS,Breadth-Firsh Search  宽度优先遍历 */
int bfs()
{
	int front=0,rear=1;
	Node* q[maxn];
	q[0]=root;
	while(front<rear)
	{
		Node* tmp=q[front++];
		if(tmp->have_value==0) return 0;

		ans[n++]=tmp->v;
		if(NULL != tmp->left)  q[rear++]=tmp->left;
		if(NULL != tmp->right) q[rear++]=tmp->right;
	}
	return 1;
}

void remove_tree(Node* u)
{
	if(NULL==u) return ;
	remove_tree(u->left);
	remove_tree(u->right);
	free(u);
}

int main()
{
	read_input();

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

入门题二:

输入一颗二叉树的先序遍历和中序遍历,输出它的后序遍历序列。

例子输入:

DBACEGF ABCDEFG

BCAD CBAD

例子输出:

ACBFGED

CDAB

#include "stdio.h"
#include "string.h"
#define maxn 20
char preorder[maxn],inorder[maxn],postOrder[maxn]; 		//先序、中序 和后序 

//n树的节点个数,pre前序,in中序,post后序
void build(int n,char *pre,char *in,char *post)
{
	if(n<=0) return;
	int x=strchr(in,pre[0])-in;		//找到根节点在中序遍历中的位置
	build(x,pre+1,in,post);			//递归构造左子树的后序遍历
	build(n-x-1,pre+x+1,in+x+1,post+x);		//递归构造右子树的后序遍历
	post[n-1]=pre[0];	//根节点加入到最后
}

int main()
{
	while(scanf("%s%s",preorder,inorder)==2)
	{
		int n=strlen(preorder);
		build(n,preorder,inorder,postOrder);
		postOrder[n]=‘\0‘;
		printf("%s\n",postOrder);
	}
	return 0;
} 
时间: 2024-08-09 02:15:25

二叉树学习——简单入门题的相关文章

SVN学习——简单入门之创建仓库、导入、检出(一)

从刚刚参加工作就开始使用svn,清晰的记得那年师姐比较生气的来找我:"你怎么又不更新就提交代码了,把我写的都给覆盖掉了",哈哈~ 虽然一直在用svn,不过在日常工作中主要用到的是简单的操作,而且大多数是基于eclipse插件.客户端小乌龟直接操作的.对于svn的理解还是比较单一的.当然目前除了集中式版本管理工具svn之外,比较火的还有分布式的版本管理工具git. 下面借着学习svnkit的机会,把svn也学习一遍,加深了解~ 官网简单介绍: 官网:http://subversion.a

Asp.Net MVC学习总结(一)——Asp.Net MVC简单入门

出处:http://www.cnblogs.com/SeeYouBug/p/6401737.html 一.MVC简单入门 1.1.MVC概念 视图(View) 代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML.XML和Applet. 模型(Model) 表示用户对其数据的操作的一个封转.可以分为视图模型(view model)和领域模型(domain models),视图模型就是在视图与控制器之间传输数据的一个封转,而领域模型就是业务逻辑,后台数据模型等的一个集

android的简单入门学习

话说光配环境就整死我了, 不是说多么难, 是最近google被屏了, 很多sdk里面需要下载的东西都下不下来, 坑爹啊.  最后跟扫拉稀要了一个他配置好的,才运行了. android目录分析: assets 资产目录,存放文件,这些文件会被打包到应用程序的apk(安装包) bin 编译后的文件目录 gen 目录自动生成的目录 project.properties 代表编译的版本 target = "" 来修改编译版本 libs 支持jar包 会被添加到android depend 目录

mongodb学习(搭建开发环境+简单入门)

接下来这段时间,我将会学习mongodb,由浅入深,并且将学习的过程会详细记录下来.mongodb是什么?我想这一点不需要我过多的解释.好了,废话不多说,我们直奔主题,看看mongodb开发环境的搭建.说明一点,在学习mongodb期间,我的所有 操作都是在windows下完成的.下面我带大家一步一步学习windows下mongodb开发环境的搭建 下载mongodb 首先我们需要到mongodb的官网下载mongodb. http://www.mongodb.org/downloads 新建一

Neo4j学习(2)--简单入门

1.Neo4j属性图数据模型 节点:包含属性 属性:键值对形式 关系:单向,连接节点 标签:type,区分节点 2.Neo4j基本语句 3.Neo4j JavaAPI 1> 节点操作 (1)节点:GraphDatabaseService().createNode() (2)建立两个节点之间的关系:Node.createRelationShipTo(...) (3)节点添加属性:Node.setProperty(name,value)  Neo4j中不允许null属性值   (4)节点属性删除:N

ECharts.js学习(一) 简单入门

EChart.js 简单入门 最近有一个统计的项目要做,在前端的数据需要用图表的形式展示.网上搜索了一下,发现有几种统计图库. MSChart   这个是Visual Studio里的自带控件,使用比较简单,不过数据这块需要在后台绑定. ichartjs 是一款基于HTML5的图形库.使用纯javascript语言, 利用HTML5的canvas标签绘制各式图形. 支持饼图.环形图.折线图.面积图.柱形图.条形图等. Chart.js 也是一款基于HTML5的图形库和ichartjs整体类似.不

概率DP入门题

一 概率问题的论文 1.算法合集之<信息学竞赛中概率问题求解初探> 2.有关概率和期望问题的研究 3.算法合集之<浅析竞赛中一类数学期望问题的解决方法> 二 入门题目 1.POJ 3744 Scout YYF I (简单题) 题意:一条路上有n个地雷 ,a[i]代表第i个地雷放的位置,求安全走过这段路的概率 分析:若第k个位置有地雷则安全走过这个位置的方案为在第k-1个位置跳两步概率为(1-p) 从反面考虑 已经安全走过了第i-1个雷 则在第i个雷的死掉的概率为 1-p(从走到a[

正则表达式简单入门

 正则表达式简单入门    正则表达式在平常编程中有着大量的应用,对于任何一个想学习编程的人来说,正则表达式是一个必须掌握的知识. 废话不多说,下面先对正则表达式做一个简单的入门介绍,在后续的文章中,将会进行详细的介绍.    一.元字符 元字符一共有12个:$ ( ) [ { ? + * . ^ \ | 元字符有特殊的含义,如果要使用其字面值,则必须对其进行转义. 如: \$  \*  \( 等等 二.控制字符或不可打印字符 \a  警报 \e  退出 \f  换页 \n  换行 \r 

Vue学习笔记入门篇——组件的内容分发(slot)

本文为转载,原文:Vue学习笔记入门篇--组件的内容分发(slot) 介绍 为了让组件可以组合,我们需要一种方式来混合父组件的内容与子组件自己的模板.这个过程被称为 内容分发 (或 "transclusion" 如果你熟悉 Angular).Vue.js 实现了一个内容分发 API,使用特殊的 'slot' 元素作为原始内容的插槽. 编译作用域 在深入内容分发 API 之前,我们先明确内容在哪个作用域里编译.假定模板为: <child-component> {{ messa