数据结构——c语言 广义表获取二叉树
设计并验证如下算法:输入一棵二叉树的广义表形式,建立该二叉树的二叉链表结构,并求其总结点数目。例如,对“12.7.4参考源程序”所示二叉树,按下列形式读入字符:C(E(I,J),F(,G(K,H)))#。直接上代码:#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<string.h&g
·
戳这里还有其他数据结构的题目噢
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;
}
(代码如有雷同,可能存在借鉴他人部分代码情况)
(请不要直接复制使用。总结的代码仅供参考,希望读者借此代码自身可以理解学习)
如果代码对您有帮助,不要忘记评论收藏噢~

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