#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 语言实现,主要包括线索二叉树的建立和遍历过程。
3. 后序遍历:后序遍历的顺序是左子树 -> 右子树 -> 根节点,后序线索化较为复杂,因为后继节点可能在当前节点的祖先中。线索化后,后序遍历可以避免使用递归或栈,直接按照线索找到下一个节点。 4. 线索化过程:...
对于二叉树的非递归遍历算法,除了优化栈空间使用之外,还有助于理解和实现其他数据结构,如线索二叉树,以及在实际问题中的应用,如序列化和反序列化二叉树。这些算法在面试中也经常被问到,是每个程序员应该掌握的...
本资源主要讲述了数据结构树和二叉树遍历的相关知识点,包括二叉树的基本概念、二叉树遍历的六种方案、先序、中序、后序遍历算法的实现、线索二叉树的概念等内容。 二叉树的基本概念 二叉树是一种特殊的树形结构,...
二叉树的递归遍历算法非常好写。这个.cpp文件里是二叉树的非递归遍历!
在后序线索二叉树中,每个节点的左线索指向其后序遍历的后继节点,右线索指向其父节点。对于非叶子节点,如果其右子树为空,右线索指向其父节点;如果其左子树为空且右子树不为空,右线索指向其后序遍历的第一个节点...
本文将深入探讨二叉树的前序、中序、后序遍历的递归和非递归算法。 1. **前序遍历**: - **递归算法**:首先访问根节点,然后递归地对左子树进行前序遍历,最后对右子树进行前序遍历。伪代码如下: ``` function...
线索二叉树可以分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。在本文中,我们将讨论中序线索二叉树的建立、删除、插入和恢复线索。 一、线索二叉树的建立 线索二叉树的建立可以通过遍历二叉树并将每个...
2. 类型:线索二叉树分为两种类型:前序线索二叉树、中序线索二叉树和后序线索二叉树,分别对应不同顺序的遍历。 构建线索二叉树: 1. 初始化:在构建线索二叉树之前,首先需要对原始二叉树进行遍历,并为每个节点...
线索二叉树的后序遍历通常比前序和中序遍历复杂,因为后继节点的信息不足以确定当前节点是否已被访问过。可以使用栈辅助实现,但不直接依赖线索。 在C语言中实现线索二叉树,我们需要定义一个结构体来表示节点,...
关于数据结构实验的二叉树问题
线索二叉树是一种特殊形式的二叉树,它在二叉链表的基础上增加了线索,用于在树中进行更高效的前序、中序和后序遍历。这种数据结构在计算机科学,尤其是数据结构课程中占有重要地位,因为它能有效地解决非递归遍历的...
后序遍历线索二叉树则更为复杂,需要借助栈来逆向构建后序遍历序列,由于后序遍历的特性,通常需要从叶子节点出发,先遍历右子树再遍历左子树,才能确定节点的后继。 严蔚敏教授在其著作《数据结构》中详细讲解了...
[问题描述] 建立二叉树,并输出二叉树的先序,中序和后序遍历序列,以及二叉树的叶子数。 [基本要求] 要求根据读取的元素建立二叉树,能输出各种遍历。 [实现提示] 可通过输入带空格的前序序列建立二叉链表。
线索二叉树是一种特殊的二叉树结构,它在二叉链表的基础上增加了线索,以便于在非递归情况下进行前序、中序和后序遍历。在C++中实现线索二叉树需要理解二叉树的基本概念以及链式存储结构。本文将深入探讨线索二叉树...
3. 设计前序、中序、后序线索二叉树遍历算法。 4. 编写测试用例,验证各种操作的正确性。 线索二叉树的构建: 构建线索二叉树分为两个阶段:普通二叉树到线索二叉树的转换和线索化。在转换过程中,我们需要遍历...
线索二叉树通过在空指针上添加线索,指示前驱或后继节点的位置,使得非递归的中序、先序和后序遍历变得可能。 首先,我们需要了解线索二叉树的基本结构。`Tree` 类定义了一个节点,包括一个整数值 `num` 和两个指向...
线索二叉树的先序,中序,后序遍历完整代码,在vs2013下编译通过
本节内容主要介绍了数据结构中的树和二叉树,特别是关于遍历二叉树和线索二叉树的概念及算法。首先,树是一种非线性的数据结构,由根节点、左子树和右子树组成。二叉树是特殊的树,每个节点最多有两个子节点,分为左...