【二叉树->链表】二叉树结构转双向线性链表结构(先序遍历)
来源:互联网 发布:淘宝上的川味小吃店铺 编辑:程序博客网 时间:2024/04/29 15:59
二叉树存储结构属于非线性链表结构,转化成线性链表结构,能简化操作和理解。然而由非线性转线性需要对整个树遍历一次,不同的遍历方式转化结果页不一样。下面以先序为例。
方法一:
递归法。递归遍历二叉树,因为是双向链表,需要记录当前遍历元素的上一个元素。
方法二:
使用栈。先将遍历元素入栈,遍历完成后,出栈并连接成链表。
struct tree_node;struct tree_node{struct tree_node *lc;struct tree_node *rc;char data;};typedef struct tree_node treenode;void pre_create_tree(treenode **T){ //递归法char datatemp;fflush(stdin);datatemp=getchar();if(datatemp=='*'){*T=NULL;}else{if((*T=(treenode*)malloc(sizeof(treenode)))==NULL){exit(0);}else{(*T)->data=datatemp;(*T)->lc = (*T)->rc = NULL;pre_create_tree(&(*T)->lc);pre_create_tree(&(*T)->rc);}}}struct mytlist{struct mytlist* front;struct mytlist* next;char data;};typedef struct mytlist tlist;static tlist *cur_front=NULL;static tlist **cur_next;void pre_tree2list(treenode *tree, tlist** tlist_head){ //传递函数参数tlist_front必须传入NULLtlist* tlist_temp=NULL;if(tree==NULL){*tlist_head = NULL;return;}if((tlist_temp=(tlist*)malloc(sizeof(tlist)))==NULL){printf("malloc failed\n");exit(0);}else{tlist_temp->front = cur_front;*tlist_head = tlist_temp;tlist_temp->data = tree->data;cur_front = *tlist_head;cur_next = &(*tlist_head)->next;pre_tree2list(tree->lc, cur_next);pre_tree2list(tree->rc, cur_next);}}void visit_tlist(tlist* tlist_head){while(tlist_head){printf("%c ", tlist_head->data);tlist_head = tlist_head->next;}}int main(void){treenode *mytree=NULL;tlist *mytlist=NULL;pre_create_tree(&mytree);pre_tree2list(mytree, &mytlist);visit_tlist(mytlist); printf("\n");system("pause");return 0;}
测试样例:
/*先序为DLR(D:根节点,L:左子树,R:右子树)
a
/ \
b c
/ \ / \
d * * e
*/
//先序序列为abdce,输入为abd***c*e**(*表示空格,代表空树)
对于一般树的情况,使用孩子兄弟表示法,将一般树表示成二叉树(结点存储结构为:指向本结点第一个孩子的指针,数值,指向同层下一个兄弟的指针),再由这个二叉树即可转换为线性链表结构。
对于森林的情况,将森林的每一棵树的根结点视为兄弟,再次使用孩子兄弟表示法转换成一般树结构。
0 0
- 【二叉树->链表】二叉树结构转双向线性链表结构(先序遍历)
- 二叉树的二叉链表存储结构构建以及先序遍历
- 基于先序遍历和中序遍历序列构建二叉树结构【C语言】
- 【二叉树】先序遍历二叉树
- 先序遍历二叉树
- 先序遍历二叉树
- 二叉树 - 先序遍历
- 先序遍历二叉树
- 先序遍历二叉树
- 二叉树转双向链表+BFS+中序遍历
- 由先序遍历和中序遍历构造二叉树的二叉链表代码
- 二叉树遍历--遍历顺序推出二叉树结构
- 二叉树--链表结构
- 由二叉树的先序和中序遍历生成二叉树的层序和后序遍历结构
- 二叉树中结构体的应用,以及先序,中序,后序,层次遍历的输出
- 二叉树的递归与非递归遍历(二叉链表结构)
- 二叉树-----静态二叉链表(游标)-----建立(先序)+遍历(7种)
- 二叉树-----动态二叉链表-----建立(先序)+遍历(7种)
- 【开发小谈】Activity切换动画 android界面切换动画 手机切换动画(二)
- java List 排序问题
- 极点中文2011周年珍藏版备份
- C++ Primer 函数
- 设计模式--适配器模式和外观模式
- 【二叉树->链表】二叉树结构转双向线性链表结构(先序遍历)
- 【Machine Learning Done Wrong】机器学习七种易犯的错误
- linux文件系统
- Merge Sorted Array:from LeetCode
- 一个简单的仿Button设定监听接口,以及回调方法
- C++ Primer 语句
- cocos2dx游戏 地图
- 传输层:TCP、UDP和SCTP
- PAT4-09. 笛卡尔树