【二叉树->链表】二叉树结构转双向线性链表结构(先序遍历)
二叉树存储结构属于非线性链表结构,转化成线性链表结构,能简化操作和理解。然而由非线性转线性需要对整个树遍历一次,不同的遍历方式转化结果页不一样。下面以先序为例。
方法一:
递归法。递归遍历二叉树,因为是双向链表,需要记录当前遍历元素的上一个元素。
方法二:
使用栈。先将遍历元素入栈,遍历完成后,出栈并连接成链表。
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必须传入NULL
tlist* 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**(*表示空格,代表空树)
对于一般树的情况,使用孩子兄弟表示法,将一般树表示成二叉树(结点存储结构为:指向本结点第一个孩子的指针,数值,指向同层下一个兄弟的指针),再由这个二叉树即可转换为线性链表结构。
对于森林的情况,将森林的每一棵树的根结点视为兄弟,再次使用孩子兄弟表示法转换成一般树结构。
【二叉树->链表】二叉树结构转双向线性链表结构(先序遍历)的更多相关文章
- python算法:LinkedList(双向线性链表)的实现
LinkedList是一个双向线性链表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一 ...
- 【C++】双向线性链表容器的实现
// 双向线性链表容器 #include <cstring> #include <iostream> #include <stdexcept> using name ...
- [二叉树建树]1119. Pre- and Post-order Traversals (30) (前序和后序遍历建立二叉树)
1119. Pre- and Post-order Traversals (30) Suppose that all the keys in a binary tree are distinct po ...
- Java构造二叉树、树形结构先序遍历、中序遍历、后序遍历
package com.example.demo; public class BTree { public int data; public BTree left; public BTree rigt ...
- C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历、中序遍历、后续遍历)
树 利用顺序存储和链式存储的特点,可以实现树的存储结构的表示,具体表示法有很多种. 1)双亲表示法:在每个结点中,附设一个指示器指示其双亲结点在数组中的位置. 2)孩子表示法:把每个结点的孩子排列起来 ...
- 二叉树 Java 实现 前序遍历 中序遍历 后序遍历 层级遍历 获取叶节点 宽度 ,高度,队列实现二叉树遍历 求二叉树的最大距离
数据结构中一直对二叉树不是很了解,今天趁着这个时间整理一下 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显 ...
- 前、中、后序遍历随意两种是否能确定一个二叉树?理由? && 栈和队列的特点和区别
前序和后序不能确定二叉树理由:前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树. 由二叉树的中序和前序遍历序列 ...
- 【LeetCode】145. 二叉树的后序遍历
145. 二叉树的后序遍历 知识点:二叉树:递归:Morris遍历 题目描述 给定一个二叉树的根节点 root ,返回它的 后序 遍历. 示例 输入: [1,null,2,3] 1 \ 2 / 3 输 ...
- (原)neuq oj 1022给定二叉树的前序遍历和后序遍历确定二叉树的个数
题目描述 众所周知,遍历一棵二叉树就是按某条搜索路径巡访其中每个结点,使得每个结点均被访问一次,而且仅被访问一次.最常使用的有三种遍历的方式: 1.前序遍历:若二叉树为空,则空操作:否则先访问根结点, ...
随机推荐
- android fragment 跳到另一个fragment
一共有4个fragment,分别是contact(联系人),friends(朋友),search(查找),more(更多).使用的都是同一个布局,每个fragment中都有四个内部按钮,可以切换到其他 ...
- 电机转矩T=9550*P/N推导。
很奇怪,这个公式怎么来的,原来好多是基础物理的,也许我们初中高中物理书上多有,基础真的是很基础的基础. P=F*V (1) ,即功率=力*速度 T=F*R (2) ,即力矩=力*作用长度 ,在电机里 ...
- Wap touch flispan demo
直接上代码了 仔细看看例子就会明白 简单实用 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8& ...
- Windows多线程同步系列之四-----信号量
信号量说实话自己没怎么使用过.书上大概这样说,信号量设置一个资源访问计数.当该计数值大于0的时候,该信号量对象 为有信号状态,当该计数值等于0的时候,该信号量对象为无信号状态. 我们来查几个主要的AP ...
- 内存映射与DMA
1.mmap系统调用的实现过程,该系统调用直接将设备内存映射到用户进程的地址空间. 2.用户空间内存如何映射到内核中(get_user_pages). 3.直接内存访问(DMA),他使得外设具有直接访 ...
- ubuntu centos debina
文章目录CentOSDebianCentOS与Debian哪个好?Ubuntu买VPS时有CentOS.Debian.Ubuntu三种操作系统可以选择,Linux下哪种系统更好是很多新人都会遇到的问题 ...
- Extjs实现进度条
做Extjs开发中,往往后台程序可能要执行一段时间才能得到返回结果,加入进度条可以提高客户体验度,以下为两种便捷的方式: 1.提交数据前用Ext.Msg.wait('提示','正在处理数据,请稍候') ...
- Yii2 框架下bootstrap 弹窗预览视频等~
Yii2 本身已经引用了'yii\bootstrap\BootstrapAsset',所以使用bootstrap 非常简洁. 1 在PHP页面引用命名空间 use app\assets\AppAsse ...
- 格而知之6:我所理解的Runtime(1)
基本简介 1.根据官方文档,OC有一个特性:它会尽可能把一些决定从编译时和链接时推迟到运行时才处理,所以这门语言需要的就不只是一个编译器,它还需要一个runtime系统来处理那些已经被编译过的代码. ...
- Vue.js快速入门
Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们 ...