二叉树的建立与相关运算
以广义表的形式输入二叉树,建立二叉链表,完成如下功能:
三种递归遍历
计算并输出单分支节点,双分支结点,叶子结点及其个数。
把任一种递归算法改为非递归算法。
数据结构 二叉树的建立与相关运算
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 山楂奶酪黄连蒜 2015-12-17 09:40关注
#include
#include#define N 20
typedef struct tree
{
char data;
struct tree *pa;
struct tree *lc;
struct tree *rc;
}sTre,*pTre;void output(pTre p);
void create_tree(pTre root,char arr[N]);
int pre_create_tree(pTre p,char arr[N],int i);
void init_node(pTre *p);
void create_memory(pTre *p);
void pre(pTre p);
void mid(pTre p);
void last(pTre p);
void free_memory(pTre *p);
void delete_node(pTre p);
void unload(pTre p);int main()
{
pTre root=NULL;
init_node(&root);
char arr[N];
printf("please input pre tree:\n");
gets(arr);
create_tree(root,arr);
output(root);
unload(root);
return 0;
}void create_tree(pTre root,char arr[N])
{
if(arr[0]=='\0')
{
printf("input error!\n");
return;
}
root->data=arr[0];
pre_create_tree(root,arr,1);
}int pre_create_tree(pTre p,char arr[N],int i)
{
pTre pnew=NULL;
if(arr[i]=='\0')
{
return i;
}
if(arr[i]!=' ')
{
init_node(&pnew);
pnew->data=arr[i];
p->lc=pnew;
pnew->pa=p;
i=pre_create_tree(pnew,arr,i+1);
if(arr[i]=='\0')
{
return i;
}
}
i++;
if(arr[i]=='\0')
{
return i;
}
if(arr[i]!=' ')
{
init_node(&pnew);
pnew->data=arr[i];
p->rc=pnew;
pnew->pa=p;
i=pre_create_tree(pnew,arr,i+1);
}
return i;
}void init_node(pTre *p)
{
create_memory(p);
(*p)->pa=NULL;
(*p)->lc=NULL;
(*p)->rc=NULL;
}void create_memory(pTre *p)
{
*p=malloc(sizeof(sTre));
if(NULL==*p)
{
printf("create memory error!\n");
exit(-1);
}
}void pre(pTre p)
{
if(p!=NULL)
{
printf("%c ",p->data);
pre(p->lc);
pre(p->rc);
}
}
void mid(pTre p)
{
if(p!=NULL)
{
mid(p->lc);
printf("%c ",p->data);
mid(p->rc);
}
}
void last(pTre p)
{
if(p!=NULL)
{
last(p->lc);
last(p->rc);
printf("%c ",p->data);
}
}void unload(pTre p)
{
if(p!=NULL)
{
unload(p->lc);
unload(p->rc);
delete_node(p);
}
}void delete_node(pTre p)
{
p->pa=NULL;
free_memory(&p);
}void free_memory(pTre *p)
{
if(*p!=NULL)
{
free(*p);
*p=NULL;
}
}void output(pTre p)
{
printf("pre:");
pre(p);
printf("\nmid:");
mid(p);
printf("\nlast:");
last(p);
printf("\n");
}本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 win7系统进入桌面过一秒后突然黑屏
- ¥15 有一台三相异步电动机 M1控制一个小车,有四个控制按钮,一个复位、一个启动、一个停止,还有一个急停,两个行程开关分别为上限位和下限位。 上限位。 下限位。
- ¥30 backtrader对于期货交易的现金和资产计算的问题
- ¥15 求C# .net4.8小报表工具
- ¥15 安装虚拟机时出现问题
- ¥15 Selenium+docker Chrome不能运行
- ¥15 mac电脑,安装charles后无法正常抓包
- ¥18 visio打开文件一直显示文件未找到
- ¥15 请教一下,openwrt如何让同一usb储存设备拔插后设备符号不变?
- ¥50 使用quartz框架进行分布式任务定时调度,启动了两个实例,但是只有一个实例参与调度,另外一个实例没有参与调度,不知道是为什么?请各位帮助看一下原因!!