今天学习了线索二叉树的建立,于是走了一遍代码
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
/*
二叉树线索存储结构的定义
Link=0;代表指向左右孩子的指针
Thread=1, 代表指向前驱或者后继的线索
*/
typedef enum{Link,Thread}PointerTag;//枚举类型
typedef char TypeData;
//创建一个树的结构体
typedef struct BiTreeNode{
TypeData data;//树的数据部分
struct BiTreeNode *lchild,*rchild;//树的左右孩子
PointerTag LTag;//左右标志域
PointerTag RTag;
}BITREENODE;
BITREENODE* createBiTree();//创建二叉树
void preOrderBiTree(BITREENODE* T);//前序遍历二叉树
void InThreadBiTree(BITREENODE *T);//中序线索遍历二叉树
void InOrderBiTree_Thread(BITREENODE *T);//中序遍历二叉树
//创建二叉树
BITREENODE *createBiTree(){
TypeData ch=0;
BITREENODE *pNewNode=NULL;
cin>>ch;
if(ch=='#')//输入#截止
{
pNewNode=NULL;
}
else{
//给结点分配内存
pNewNode=(BITREENODE *)malloc(sizeof(BITREENODE));
pNewNode->data=ch;//给数据域赋值
pNewNode->LTag=pNewNode->RTag=Link;//创建结点时,标志位都是0
//采用递归的思想创建左右子树
pNewNode->lchild=createBiTree();//创建左子树
pNewNode->rchild=createBiTree();//创建右子树
}
return pNewNode;
}
//前序遍历二叉树
void preOrderBiTree(BITREENODE *T){
if(T){
cout<<T->data<<" ";
preOrderBiTree(T->lchild);
preOrderBiTree(T->rchild);
}
}
/*
中序遍历线索二叉树
*/
BITREENODE *pre=NULL;//全局变量 ,始终指向刚刚访问过的结点
void InThreadBiTree(BITREENODE * T){
if(T){
//递归线索化左子树
InThreadBiTree(T->lchild);
//如果没有左孩子
if(!T->lchild)
{
T->LTag=Thread;//如果没有左孩子,那么将前驱标志位设为1,这样左孩子区域就指向前驱
T->lchild=pre;//
}
//前驱没有右孩子
if(pre!=NULL&&pre->rchild==NULL)//前驱没有右孩子
{
pre->RTag=Thread;//将后驱标志位设为1
pre->rchild=T;//前驱的右孩子指向后继
}
//保持pre指向T的前驱
pre=T;
//递归右子树线索化
InThreadBiTree(T->rchild);
}
}
//中序遍历该线索二叉树
void InOrderBiTree_Thread(BITREENODE *T){
BITREENODE *p=T;
while(p!=NULL){
//当LTag==0时循环到中序序列的第一个结点
//一路向下遍历
while(p->LTag==Link){
p=p->lchild;
}
//打印出该结点的数值
cout<<p->data<<" ";
//打印出当前结点的后继
while(p->RTag==Thread&&p->rchild!=NULL){
p=p->rchild;
cout<<p->data<<" ";
}
//指向该结点的后继
p=p->rchild;
}
cout<<endl;
}
int main(void){
BITREENODE *pRoot=NULL;
//创建二叉树
pRoot=createBiTree();
//前序遍历该二叉树,这时候还没有线索化二叉树 可以这样进行前序遍历
preOrderBiTree(pRoot);
cout<<endl;
//中序线索化该二叉树
InThreadBiTree(pRoot);
InOrderBiTree_Thread(pRoot);
return 0;
}
[添加链接描述](https://blog.youkuaiyun.com/weixin_37818081/article/details/78545843)`