数据结构小作业——广义表输入二叉树

问题描述

广义表输入二叉树,“#”表示空树


A(B(D,E),C(F,#))

reference

思路

老规矩,举几个例子分析下。
创建左子树之前,要输入一个"(",遇到“,”表示输入结束
创建右子树之前,要输入一个“,”,遇到“)”表示输入结束
遇到#表示是空树。
怎么创建?递归?状态转换机?这里用状态转换机不能做吧?因为有好多节点啊,要怎么保存?那就用递归吧,不过每次还得把节点的孩子找出来,就是提取出()中的内容来传递下去。
试着用递归来做:
所以输入的可能情况

大写字母


#

观察发现,每个大写字母或者#后面跟着 或者
递归结构为A(X,Y)(X,Y为子树)或者A
若是第一种结构,那么对他的左右子树进行创建,若是第二种结构,
每次递归时,先看第一个字符是什么,然后看他后面的字符是什么,这样能判断递归结构是什么,进而判断下一步怎么做。
第一个字符之后,有以下几种情况

1.( ——>说明这个递归结构是A(X,Y)
2. ,或者 )——>说明这个递归结构是A

还有一种特殊情况就是,可能一个字母后面跟着两个符号。比如A(B(D,E),C(F,#))这样的话进行下一步之前需要把那个“,”读入,不要影响下一步。

code

广义表方式创建二叉树

void create(nodePtr &a)
{
	char ch;
	cin>>ch;
	if(ch == ',')//处理特殊情况 
	{
		cin>>ch;
	}
	if(ch == '#')
	{
		a = NULL;
		return;
	}
	else
	{
		a = new node;
		a->ch = ch;
		cin>>ch;//读入大写字母后面的字符
		if(ch == '(')//说明结构为A(X,Y)
		{
			create(a->left);
			cin>>ch;
			create(a->right); 
		} 
		else//说明结构为A 
		{
			a->left = NULL;
			a->right = NULL;
			return;
		}
	}
}

#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
typedef struct node{
	char ch;
	struct node *left;
	struct node *right;
}node, *nodePtr;
void create(nodePtr &a);//创建一棵二叉树 
void destroy(nodePtr a);//删除二叉树 
void print(nodePtr a);//打印 
int main()
{
	nodePtr a = NULL;
	create(a);
	print(a);
} 
void create(nodePtr &a)
{
	char ch;
	cin>>ch;
	/*if(ch == ',')//处理特殊情况 
	{
		cin>>ch;
	}*/
	if(ch == '#')
	{
		a = NULL;
		return;
	}
	else
	{
		a = new node;
		a->ch = ch;
		cin>>ch;//读入大写字母后面的字符
		if(ch == '(')//说明结构为A(X,Y)
		{
			create(a->left);
			cin>>ch;
			create(a->right); 
		} 
		else//说明结构为A 
		{
			a->left = NULL;
			a->right = NULL;
			return;
		}
	}
}
void destroy(nodePtr a)
{
	if(a == NULL)
	{
		return;
	}
	else
	{
		destroy(a->left);
		destroy(a->right);
		delete a;
	}
}
void print(nodePtr a)
{
	if(a == NULL)
	{
		cout<<" ";
	}
	else
	{
		cout<<a->ch;
		print(a->left);
		print(a->right);
	}
}
 
/*
1.
A(B(D,E),C(F,#))
ABD  E  CF   |
2.#
 |
3.
A(#,B)
A B  |
4. 
A(B,#)
AB   |
*/ 

测试用例

/*
1.
A(B(D,E),C(F,#))
ABD  E  CF   |
2.#
 |
3.
A(#,B)
A B  |
 - 
A(B,#)
AB   |
*/ 

总结

上面的思路边想边写的,感觉,emmm,乱七八糟,这里再写一个。
举几个例子观察一下广义表输入的特征,发现:

  • 对每次递归的子树的结构,有两种情况,A(X,Y)A
  • 每个大写字母后边跟着一个或者两个符号

步骤:
特殊情况:需要先判断字符是不是,,若是,则无效,需要再读一个
1.判断是不是空树。若是空树,给传入的指针赋值NULL,否则继续准备判断递归结构
2.通过该字符的下一个字符来判断递归结构。
若下一个是则为A结构,赋值之后return
若下一个是(则为A(B,C)结构,需要递归创建其左子树,右子树。

扫描二维码关注公众号,回复: 9861119 查看本文章

注意

不要忘记给空指针赋值NULL啊!!!

发布了74 篇原创文章 · 获赞 4 · 访问量 1425

猜你喜欢

转载自blog.csdn.net/weixin_44814121/article/details/102851187