戳这里还有其他数据结构的题目噢

https://blog.csdn.net/qq_45724947/article/details/115625130?spm=1001.2014.3001.5501


设计并验证如下算法:输入一棵二叉树的广义表形式,建立该二叉树的二叉链表结构,并求其总结点数目。例如,对“12.7.4 参考源程序”所示 二叉树, 按下列形式读入字符: C(E(I,J),F(,G(K,H)))#。

直接上代码: 

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
 
#define OK		1
#define ERROR	0
 
typedef int Status;
typedef char TElemType;
typedef struct BiTree {
	TElemType data;//储存元素  
	struct BiTree *lchild, *rchild; 
}Tree;
 
void InitBiTree(Tree *BT) {//构造空二叉树 
	BT = NULL; 	
}

Tree *init_node(char val){
	Tree *p = (Tree *)malloc(sizeof(Tree));
	p->data = val;
	p->lchild = p->rchild = NULL;
	return p;
}

typedef struct Stack{
	Tree **data;
	int top, size;
} Stack;

Stack *init_stack(int n){
	Stack *s = (Stack *)malloc(sizeof(Stack));
	s->data = (Tree **)malloc(sizeof(Tree *)* n);//记录节点地址
	s->size  = n;
	s->top = -1;
	return s;
}

Tree *top(Stack *s){//为空怎么办??
	return s->data[s->top];
}

int empty(Stack *s){//放空栈顶元素 
	return s->top == -1;
}

int push(Stack *s, Tree *val){
	if (s == NULL) return 0;
	if (s->top == s->size - 1) return 0;//栈满
	//expand
	s->data[++(s->top)] = val;
	return 1;
}

int pop(Stack *s){
	if (s == NULL) return 0;
	if (empty(s)) return 0;
	s->top--;
	return 1;
}

Tree *table_build(char *str){
	Stack *s;
	s = init_stack(strlen(str));
	Tree *temp = NULL,*p = NULL;//可能只有一个根节点,p记录根节点 
	int flag = 0; 
	while(*str){
		switch (*str){
		case '(':
			 push(s,temp)
			 ;
			 flag = 0;
			 break;
		case ',':
			flag = 1;
			break;
		case ')':
			p = top(s);//最后出栈为根节点 
			pop(s);
			break;
		default://遇字母,设为栈顶的孩子
			temp = init_node(*str);//重新申请空间树,赋结点值 
			if(!empty(s) && flag == 0){ 
				top(s)->lchild = temp;
			//	printf("左");
			}
			else if(!empty(s) && flag == 1){
				top(s)->rchild = temp;
			//	printf("右");
			}
			//printf("%c\n",temp->data);
			break;
		}	
		str++;

	}
	if (temp && !p) p = temp;//只有一个根,此时p为空

	
	return p;
}

int num = 0;//总结点 

Status PreOrder(Tree *BT) { //先序遍历二叉树 
	if(BT) {
		//printf("1\n");
		if(!(BT->data))
			return ERROR;
		printf("%c ", BT->data);
		num++;
		PreOrder(BT->lchild);
		PreOrder(BT->rchild);
		return OK; 
	}
}

int main(){
	printf("请输入广义表(二叉树):('#'结束)\n");
	
	TElemType str[100];
	TElemType *ch = str;
	TElemType a;
	while(1){
		scanf("%c",&a);
		if(a == '#')
			break;
		else
			(*ch)=a;						
		//printf("%c",*ch);
		ch++;
	}
	
	ch = str;
	Tree *tree;
	InitBiTree(tree);


	tree = table_build(ch);


	printf("先序遍历二叉树\n"); 
	PreOrder(tree);

	printf("\n二叉树的结点数为%d",num);
	return 0;
	

}

 (代码如有雷同,可能存在借鉴他人部分代码情况)

(请不要直接复制使用。总结的代码仅供参考,希望读者借此代码自身可以理解学习)

如果代码对您有帮助,不要忘记评论收藏噢~

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐