采用中序线索链表存储结构,实现中序遍历
2016-11-07 13:35
363 查看
采用中序线索链表存储结构,实现中序遍历
(1)定义线索链表的存储结构;
(2)按先序遍历创建一棵二叉链表树;
(3)实现二叉链表的中序线索化;
(4)实现中序线索链表的中序遍历。#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef char TElemType;
/*2. 采用中序线索链表存储结构,实现中序遍历
(2)按先序遍历创建一棵二叉链表树;
(3)实现二叉链表的中序线索化;
(4)实现中序线索链表的中序遍历。
*/
typedef enum PointerTag { Link, Thread };//Link==0:指针 Thread==1:线索
typedef struct BiThrNode {
TElemType data;
struct BiThrNode *lchild, *rchild;//左右孩子指针
PointerTag LTag, RTag;//左右标志
}BiThrNode, *BiTrTree;
BiTrTree pre = (BiThrNode*)malloc(sizeof(BiThrNode));
//先序遍历创建一颗二叉链表树
void CreateBiTree(BiTrTree &T) {
char ch;
scanf("%c", &ch);
if (ch == '#') T = NULL;
else {
if (T = (BiThrNode *)malloc(sizeof(BiThrNode))) {
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
}
//(3)实现二叉链表的中序线索化;
void InThreading(BiTrTree P) {
if (P) {
InThreading(P->lchild);
if (!P->lchild) {
P->LTag = Thread;
P->lchild = pre;
}
else P->LTag = Link;
if (!pre->rchild) {
pre->RTag = Thread;
pre->rchild = P;
}
else P->RTag = Link;
pre = P;
InThreading(P->rchild);
}
}
//加入头结点,中序线索二叉树
void InOrderThread_Head(BiTrTree &head, BiTrTree &P) {
head = (BiThrNode*)malloc(sizeof(BiThrNode));
head->rchild = head;//右指针回指
head->LTag = Link;
head->RTag = Thread;//建立头结点
if (!P) {
head->lchild = head;//空树
}
else {
head->lchild = P;
pre = head;
InThreading(P);//中序遍历进行中序线索化
pre->RTag = Thread;
pre->rchild = head;
head->rchild = pre;
}
}
//(4)实现中序线索链表的中序遍历。
void InOrderTraverse_Thr(BiTrTree T) {
BiTrTree p = new BiThrNode;
p = T->lchild;
while (p != T) {
while (p->LTag == Link) {
p = p->lchild;
}
printf("%c", p->data);
while (p->RTag == Thread && p->rchild != T) {
p = p->rchild;
printf("%c", p->data);
}
p = p->rchild;
}
}
int main()
{
pre->RTag = Thread;
pre->rchild = NULL;
BiTrTree P, s;
P = (BiThrNode *)malloc(sizeof(BiThrNode));
printf("请先序输入一颗树:");
CreateBiTree(P);
InOrderThread_Head(s, P);
printf("中序输出此树:");
InOrderTraverse_Thr(s);
printf("\n");
system("pause");
return 0;
}
(1)定义线索链表的存储结构;
(2)按先序遍历创建一棵二叉链表树;
(3)实现二叉链表的中序线索化;
(4)实现中序线索链表的中序遍历。#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef char TElemType;
/*2. 采用中序线索链表存储结构,实现中序遍历
(2)按先序遍历创建一棵二叉链表树;
(3)实现二叉链表的中序线索化;
(4)实现中序线索链表的中序遍历。
*/
typedef enum PointerTag { Link, Thread };//Link==0:指针 Thread==1:线索
typedef struct BiThrNode {
TElemType data;
struct BiThrNode *lchild, *rchild;//左右孩子指针
PointerTag LTag, RTag;//左右标志
}BiThrNode, *BiTrTree;
BiTrTree pre = (BiThrNode*)malloc(sizeof(BiThrNode));
//先序遍历创建一颗二叉链表树
void CreateBiTree(BiTrTree &T) {
char ch;
scanf("%c", &ch);
if (ch == '#') T = NULL;
else {
if (T = (BiThrNode *)malloc(sizeof(BiThrNode))) {
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
}
//(3)实现二叉链表的中序线索化;
void InThreading(BiTrTree P) {
if (P) {
InThreading(P->lchild);
if (!P->lchild) {
P->LTag = Thread;
P->lchild = pre;
}
else P->LTag = Link;
if (!pre->rchild) {
pre->RTag = Thread;
pre->rchild = P;
}
else P->RTag = Link;
pre = P;
InThreading(P->rchild);
}
}
//加入头结点,中序线索二叉树
void InOrderThread_Head(BiTrTree &head, BiTrTree &P) {
head = (BiThrNode*)malloc(sizeof(BiThrNode));
head->rchild = head;//右指针回指
head->LTag = Link;
head->RTag = Thread;//建立头结点
if (!P) {
head->lchild = head;//空树
}
else {
head->lchild = P;
pre = head;
InThreading(P);//中序遍历进行中序线索化
pre->RTag = Thread;
pre->rchild = head;
head->rchild = pre;
}
}
//(4)实现中序线索链表的中序遍历。
void InOrderTraverse_Thr(BiTrTree T) {
BiTrTree p = new BiThrNode;
p = T->lchild;
while (p != T) {
while (p->LTag == Link) {
p = p->lchild;
}
printf("%c", p->data);
while (p->RTag == Thread && p->rchild != T) {
p = p->rchild;
printf("%c", p->data);
}
p = p->rchild;
}
}
int main()
{
pre->RTag = Thread;
pre->rchild = NULL;
BiTrTree P, s;
P = (BiThrNode *)malloc(sizeof(BiThrNode));
printf("请先序输入一颗树:");
CreateBiTree(P);
InOrderThread_Head(s, P);
printf("中序输出此树:");
InOrderTraverse_Thr(s);
printf("\n");
system("pause");
return 0;
}
相关文章推荐
- 采用中序线索链表存储结构,实现中序遍历
- 采用二叉链表存储结构,实现其各种遍历的方法
- bo3-4.c 用单链表的基本操作实现链队列(存储结构由c3-2.h定义)的基本操作(9个)
- 已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法
- 二叉树的链式存储结构 前序 后序 中序 层序遍历操作实现 判断是否完全二叉树
- 数据结构之通用树(使用链表实现树的存储结构,双亲孩子表示法)
- 线性表的链接存储结构(单链表)的实现
- 树的存储结构,及链表实现
- 试分别以顺序表和单链表作存储结构,各写一实现线性表就地逆置的算法
- 数据结构(13)二叉树的动态链表存储和遍历的实现
- 单链表的链接存储结构实现
- 定时链表处理 程序 采用 链表结构 同时运行多个定时器 仿PLC定时器结构实现
- javascript实现数据结构与算法系列:线性表的静态单链表存储结构
- 【数据结构基础】前序、中序、后序线索化二叉树(非递归实现)
- 单链表数据存储结构(c语言实现)
- 数据结构实验1 链表 实现学生信息存储,功能 增删改查,实现 结构类型
- 数据结构之---C语言实现广义表头尾链表存储表示
- 第四周【项目6-2 - 多项式加法在链表存储结构下的实现】
- C++ 单链表基本操作分析与实现 链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结
- 数据结构_串_用链表做存储结构实现KMP算法_C++实现