按广义表表示二叉树结构生成二叉树链表的算法

举报
yd_221104950 发表于 2020/12/03 01:26:02 2020/12/03
【摘要】 用广义表表示二叉树结构如下: (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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。