按广义表表示二叉树结构生成二叉树链表的算法
【摘要】 用广义表表示二叉树结构如下:
(A (B (,D (E,E),C))
1
算法如下:
#include <stdio.h>
#include <stdlib.h>
// 定义节点
typedef struct Node{
char data; struct Node* lChild;
struct Node* rChild;
} B...
用广义表表示二叉树结构如下:
(A (B (,D (E,E),C))
- 1
算法如下:
#include <stdio.h>
#include <stdlib.h>
// 定义节点
typedef struct Node{
char data; struct Node* lChild;
struct Node* rChild;
} BinTNode;
// 根据广义表表示二叉树结构来创建二叉树链表
BinTNode* createTree(char *str){
// 用指针数组st存放双亲节点
BinTNode *st[100];
// 用来一生成节点时用的
BinTNode *p = NULL;
// 二叉树链表的头节点
BinTNode *b = NULL;
// top用来记录st的栈顶,key用来记录下一个节点是当前节点的左子树(用1表示)还是右子树(用2表示),j是用来遍历str字符串用的
int top = -1,key,j=0;
// 取得第一个字符
char ch = str[j];
// 当字符串没有结束,就继续循环,'\0'是字符串的结束标记
while(ch != '\0'){ // 在遍历广义表表示二叉树结构过程中,会遇到'(',',',')'和字母
switch(ch){ // 遇到'(',就是左子树,将key标记为1,以作记录,将当前节点记录到栈st中 case '(': top++; st[top] = p; key = 1; break; // 遇到',',就是右子树,将key标记为1,以作记录 case ',': key = 2; break; // 遇到')',说明此子树已遍历完成,要返回到上一个双亲节点,准备遍历双亲节点的另一棵子树 case ')': top--; break; // 遇到节点,为节点申请内存,并初始化节点 default: p = (BinTNode*)malloc(sizeof(BinTNode)); p->data = ch; p->lChild = p->rChild = NULL; // 记录头结点 if(b == NULL){ b = p; }else{ // 如果是非头结点,那么就根据key的值,将节点添加到双亲节点的子树上去 switch(key){ case 1: st[top]->lChild = p; break; case 2: st[top]->rChild = p; break; } } }
// 遍历下一个字符
j++;
ch = str[j];
}
// 返回头结点
return b;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
测试:
int main(){
char *str = "(A(B(,D(E,F)),C))";
BinTNode* tree = createTree(str);
printf("%c",tree->data); return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
我们来看看上述程序执行过程中,st与top的变化:
本算法正是借助它们来创建二叉树链表的。
谢谢阅读。
文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_40763897/article/details/104968496
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)