#include<stdio.h>
#include<malloc.h>
#include <iostream.h>
//线索三叉树
typedef enum PointerTag{Link,Thread};
typedef struct ThrNode
{
int data;
struct ThrNode *lchild;
struct ThrNode *rchild;
struct ThrNode *parent;
PointerTag LTag,RTag;
bool tag;
}thrnode;
thrnode* pre;
//构造三叉树
bool CreateThrTree(thrnode* &T,thrnode* p)
{
char ch;
scanf("%c",&ch);
if(ch=='m')
{
T=NULL;
}
else
{
T=(thrnode*)malloc(sizeof(thrnode));
T->data=ch;
T->parent=p;
T->LTag=Link;
T->RTag=Link;
T->tag=false;
CreateThrTree(T->lchild,T);
CreateThrTree(T->rchild,T);
}
return true;
}
//打印树
void PrintTree(thrnode* T)
{
printf("%c",T->data);
}
// 建立线索
void InThreading(thrnode * p)
{
if(p)
{
InThreading(p->lchild);
InThreading(p->rchild);
if(!p->lchild)
{
p->lchild=pre;
p->LTag=Thread;
}
if(!pre->rchild)
{
pre->rchild=p;
pre->RTag=Thread;
}
pre=p;
}
}
//后序线索化
void PostOrderThreading(thrnode* &Thead)
{
pre=Thead;
InThreading(Thead->lchild);
Thead->rchild=pre;
Thead->RTag=Thread;
if(!pre->rchild)
{
pre->rchild=Thead;
pre->RTag=Thread;
}
}
//后序遍历
void PostOrderTraverse(thrnode* &T)
{
thrnode *p=T->lchild; //p 指向根节点
while(p!=T)
{
if(!p->lchild->tag && p->LTag==Link)
{
while(p->LTag==Link) p=p->lchild;
}
if(!p->rchild->tag )
{
if(p->RTag==Link)
{
p=p->rchild; //带右子树
// cout<<(char)p->data;
}
else //最左孩子无右子树
{
PrintTree(p);
p->tag=true;
// cout<<(char)p->data;
while(p->RTag==Thread && p!=T)
{
p=p->rchild;
if(p==T) break; //节点是二叉树根,退出循环
// cout<<(char)p->data;
PrintTree(p);
p->tag=true;
}
if(p==T) break; //节点是二叉树根,退出循环
p=p->parent;
}//else...if
}//endif
if(p->LTag==Link && p->RTag==Link) //当前节点既有左孩子又有右孩子
{
if(p->lchild->tag && p->rchild->tag &&!p->tag)
{
PrintTree(p);
p->tag=true;
p=p->parent;
}
else if(!p->lchild->tag)
{
p=p->lchild;
}
else
{
p=p->rchild;
}
}
else if(p->LTag==Link && p->RTag==Thread)//当前只有左孩子
{
if(p->lchild->tag)
{
PrintTree(p);
p->tag=true;
p=p->parent;
}
else
{
p=p->lchild;
}
}
else if(p->RTag==Link && p->LTag==Thread) //当前只有右孩子
{
if(p->rchild->tag)
{
PrintTree(p);
p->tag=true;
p=p->parent;
}
else
{
p=p->rchild;
}
}
else
{
PrintTree(p);
p->tag=true;
p=p->rchild;
}
}//end...while
}
//主函数
void main()
{
thrnode *head=(thrnode*)malloc(sizeof(thrnode));
head->data=0;
head->parent=NULL;
head->lchild=NULL;
head->rchild=head;
head->LTag=Link;
head->RTag=Link;
head->tag=false;
if(CreateThrTree(head->lchild,head))
{
PostOrderThreading(head);
PostOrderTraverse(head);
}
}
分享到:
相关推荐
二叉树的先序线索化 中序线索化 后序线索化 二叉树先序线索遍历 中序线索遍历 后序线索遍历
对先序线索二叉树、中序线索二叉树和后序线索二叉树进行了 C 语言实现,主要包括线索二叉树的建立和遍历过程。
目录链式存储线索二叉树中序线索二叉树中序线索化实现实现的代码过程中序线索二叉树的遍历遍历代码中序线索二叉树可运行代码先序线索二叉树先序...后序线索化实现后序线索二叉树的遍历遍历代码后序线索二叉树可运行代码...
二叉树的递归遍历算法非常好写。这个.cpp文件里是二叉树的非递归遍历!
二叉树的基本操作,包括前序、中序、后序遍历的递归和非递归算法,不得不下的资源
关于数据结构实验的二叉树问题
[问题描述] 建立二叉树,并输出二叉树的先序,中序和后序遍历序列,以及二叉树的叶子数。 [基本要求] 要求根据读取的元素建立二叉树,能输出各种遍历。 [实现提示] 可通过输入带空格的前序序列建立二叉链表。
线索二叉树的先序,中序,后序遍历完整代码,在vs2013下编译通过
1.创建以二叉链表作存储结构的二叉树; 2.按前序遍历二叉树; 3.按中序遍历二叉树; 4.按后序遍历二叉树; 5.计算二叉树的单枝结点数; 6.按层次遍历二叉树。
线索化二叉树之先序,中序,后序线索建树,先序,后序,中序遍历
说明 n个结点的二叉链表中含有n+1 【公式...根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种 一个结点的前一个结点,称为前驱结点 一个结点的后一个结点,称为后继结点
二叉树创建遍历及线索化,二叉树的创建存储以及先序中序后序遍历,图形树输出
使用C/C++实现二叉树的构造、先序遍历、中序遍历、后序遍历、中序线索化、线索化后的中序遍历等基本树操作。
线索二叉树的建立,前中后线索的建立,前中后序递归非递归遍历,广义表形式输出,层序遍历
编写一个程序实现前序线索二叉树、中序线索二叉树和后序线索二叉树,其中遍历要求用先左后右的递归或非递归算法来实现。
C语言数据结构之线索二叉树及其遍历 遍历二叉树就是以一定的规则将二叉树中的节点排列成一个线性序列,从而得到二叉树节点的各种遍历序列,其实质是:对一个非线性的结构进行线性化。使得在这个访问序列中每一个节点...