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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第六章 二叉树算法入门经典结构体指针相关的知识,希望对你有一定的参考价值。

技术分享

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

#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;
}

  

以上是关于第六章 二叉树算法入门经典结构体指针的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法(周鹏-未出版)-第六章 树-6.2 二叉树

数据结构与算法(周鹏-未出版)-第六章 树-习题

数据结构与算法(周鹏-未出版)-第六章 树-6.3 二叉树基本操作的实现

数据结构与算法(周鹏-未出版)-第六章 树-6.4 树森林

.数据结构与算法基础

数据结构与算法基础