P1305 新二叉树

该代码实现了一个程序,用于根据给定的输入创建二叉树并进行前序遍历。输入描述了二叉树的结构,程序通过递归方式创建节点并连接左右子树,遇到空节点时使用NULL表示。主要函数包括创建节点的`creat`和进行前序遍历的`put`函数。
摘要由CSDN通过智能技术生成

题目描述

输入一串二叉树,输出其前序遍历。

输入格式

第一行为二叉树的节点数 nn。(1 \leq n \leq 261≤n≤26)

后面 nn 行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。

空节点用 * 表示

输出格式

二叉树的前序遍历。

输入输出样例

输入 #1复制

6
abc
bdi
cj*
d**
i**
j**

输出 #1复制

ab

1.该题是需要搜素加创建二叉树。

2.我们可以递归搜素找节点,一步一步的遍历左右子树,然后根据该节点去创建节点。而二叉树可以看成链表。直接静态创建左右子树即可。

3.每次输入我们都需要去查找,但是根节点是需要单独创建的,因为不是根节点我们只需要创建左右子树即可,遇到*号的情况连接上NULL即可。

4.我们在创建的时候,要注意返回头节点,否则会出错。

代码如下:

#include<stdio.h>
#include<malloc.h>
typedef struct node
{
	char ch;
	struct node *lnext;
	struct node *rnext;
}NODE;
NODE *creat(NODE *head,char t,char l,char r)
{
	NODE *p,*q;
	if(head==NULL) 
	{
	//	if(t=='*') return NULL;
		head=(NODE*)malloc(sizeof(NODE));
		head->ch=t;
		p=NULL;
		q=NULL;
		if(l!='*') 
		{
			p=(NODE*)malloc(sizeof(NODE));
			p->ch=l;
			p->lnext=NULL;
			p->rnext=NULL;
		}
		if(r!='*')
		{
			q=(NODE*)malloc(sizeof(NODE));
			q->ch=r;
			q->lnext=NULL;
			q->rnext=NULL;
		}
		head->lnext=p;
		head->rnext=q;
	}
	if(head->ch==t)
	{
		p=NULL;
		q=NULL;
		if(l!='*') 
		{
			p=(NODE*)malloc(sizeof(NODE));
			p->ch=l;
			p->lnext=NULL;
			p->rnext=NULL;
		}
		if(r!='*')
		{
			q=(NODE*)malloc(sizeof(NODE));
			q->ch=r;
			q->lnext=NULL;
			q->rnext=NULL;
		}
		head->lnext=p;
		head->rnext=q;		
	}
	else 
	{
		creat(head->lnext,t,l,r);
		creat(head->rnext,t,l,r);
	}
	return head;
}
int put(NODE *head)
{
	if(head==NULL) return 0;
	printf("%c",head->ch);
	put(head->lnext);
	put(head->rnext);
}
int main()
{
	int m;
	NODE *head=NULL;
	char s[4],t,l,r;
	scanf("%d",&m);
	while(m--)
	{
		scanf("%s",s);
		t=s[0];l=s[1];r=s[2];
		head=creat(head,t,l,r);
	}
	put(head);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值