//线索二叉树的结点结构
typedef struct _ThreadBinaryTreeNode
{
int data;
int ltag , rtag;
struct _ThreadBinaryTreeNode *lchild;
struct _ThreadBinaryTreeNode *rchild;
}TBTNode;
void preThread(TBTNode *p,TBTNode *& pre)
{
if(p!=NULL)
{
if(p->lchild ==NULL)
{
p->ltag = 1;
p->lchild = pre;
}
if(pre!=NULL&&pre->rchild==NULL)
{
pre->rtag = 1;
pre->rchild = p;
}
pre = p;
//入口条件 只有有子树的才能进行递归创建线索
if(p->ltag==0)
{
preThread(p->lchild,pre);
}
if(p->rtag==0)
{
preThread(p->rchild,pre);
}
}
}
//前序线索二叉树的遍历
void preTBTOrder(TBTNode *root)
{
if(root!=NULL)
{
TBTNode * p = root;
while(p!=NULL)
{
while(p->ltag==0)
{
cout<<p->data<<endl;
p = p->lchild;
}//一直朝着左边走 直到到达最左边 最左边这个节点至多只有右子树
cout<<p->data<<endl;//访问该节点
p = p->rchild;// 如果p有右子树 则继续对其右子树进行遍历
//否则通过线索直接找到其后继。:无论有没有子树,通过这句都能找到其直接后继
}
}
}
//建立线索二叉树主程序
void createPreThread(TBTNode *root)
{
if(root!=NULL)
{
TBTNode *pre =NULL;
preThread(root,pre);
pre->rchild =NULL;
pre->rtag = 1;
}
}
//建立中序二叉树
void InThread(TBTNode *p,TBTNode *&pre)
{
if(p!=NULL)
{
InThread(p->lchild,pre);
if(p->lchild==NULL)
{
p->lchild = pre;
p->ltag =1;
}
if(pre!=NULL &&pre->rchild==NULL)
{
pre->rchild =p;
pre->rtag = 1;
}
pre =p;
InThread(p->rchild,pre);
}
}
//建立中序二叉树主程序
void createInThread(TBTNode *root)
{
if(root!=NULL)
{
TBTNode *pre =NULL;
InThread(root,pre);
pre->rchild =NULL;
pre->rtag = 1;
}
}
//中序遍历
//中序遍历线索二叉树
TBTNode *First(TBTNode *p)
{
while(p->ltag==0)
{
p =p->lchild;//一直向左边走
}
return p;
}
TBTNode* Next(TBTNode *p)
{
if(p->rtag==0)
return First(p->rchild);//找直接后继节点
else
return p->rchild;//直接找后继线索
}
void Inorder(TBTNode *root)
{
for(TBTNode *p = First(root); p!=NULL;p = Next(p))
cout<<p->data<<endl;
}
void PostThread(TBTNode *p,TBTNode *&pre)
{
if (p!=NULL)
{
PostThread(p->lchild,pre);
PostThread(p->rchild,pre);
if (p->lchild==NULL)
{
p->lchild =pre;
p->ltag = 1;
}
if (pre!=NULL&& pre->rchild==NULL)
{
pre->rchild = p;
pre->rtag = 1;
}
pre = p;
}
}
void createPostThread(TBTNode *root)
{
if(root!=NULL)
{
TBTNode *pre =NULL;
PostThread(root,pre);
pre->rchild =NULL;
pre->rtag = 1;
}
}
//
// BinaryTree.h
// BinaryTree
//
// Created by 吴珝君 on 2018/12/25.
// Copyright © 2018年 闲着也是贤者. All rights reserved.
//
#include<iostream>
#include<vector>
#include<string.h>
#include<algorithm>
#include<map>
#include<stack>
#define MAX_Size 100;
using namespace std;
//线索二叉树
//前序线索二叉树 --核心部分和尾部处理
//线索二叉树的结点结构
typedef struct _ThreadBinaryTreeNode
{
int data;
int ltag , rtag;
struct _ThreadBinaryTreeNode *lchild;
struct _ThreadBinaryTreeNode *rchild;
}TBTNode;
void preThread(TBTNode *p,TBTNode *& pre)
{
if(p!=NULL)
{
if(p->lchild ==NULL)
{
p->ltag = 1;
p->lchild = pre;
}
if(pre!=NULL&&pre->rchild==NULL)
{
pre->rtag = 1;
pre->rchild = p;
}
pre = p;
//入口条件 只有有子树的才能进行递归创建线索
if(p->ltag==0)
{
preThread(p->lchild,pre);
}
if(p->rtag==0)
{
preThread(p->rchild,pre);
}
}
}
//前序线索二叉树的遍历
void preTBTOrder(TBTNode *root)
{
if(root!=NULL)
{
TBTNode * p = root;
while(p!=NULL)
{
while(p->ltag==0)
{
cout<<p->data<<endl;
p = p->lchild;
}//一直朝着左边走 直到到达最左边 最左边这个节点至多只有右子树
cout<<p->data<<endl;//访问该节点
p = p->rchild;// 如果p有右子树 则继续对其右子树进行遍历 否则通过线索直接找到其后继。:无论有没有子树,通过这句都能找到其直接后继
}
}
}
//建立线索二叉树主程序
void createPreThread(TBTNode *root)
{
if(root!=NULL)
{
TBTNode *pre =NULL;
preThread(root,pre);
pre->rchild =NULL;
pre->rtag = 1;
}
}
//建立中序二叉树
void InThread(TBTNode *p,TBTNode *&pre)
{
if(p!=NULL)
{
InThread(p->lchild,pre);
if(p->lchild==NULL)
{
p->lchild = pre;
p->ltag =1;
}
if(pre!=NULL &&pre->rchild==NULL)
{
pre->rchild =p;
pre->rtag = 1;
}
pre =p;
InThread(p->rchild,pre);
}
}
//建立中序二叉树主程序
void createInThread(TBTNode *root)
{
if(root!=NULL)
{
TBTNode *pre =NULL;
InThread(root,pre);
pre->rchild =NULL;
pre->rtag = 1;
}
}
//中序遍历
//中序遍历线索二叉树
TBTNode *First(TBTNode *p)
{
while(p->ltag==0)
{
p =p->lchild;//一直向左边走
}
return p;
}
TBTNode* Next(TBTNode *p)
{
if(p->rtag==0)
return First(p->rchild);//找直接后继节点
else
return p->rchild;//直接找后继线索
}
void Inorder(TBTNode *root)
{
for(TBTNode *p = First(root); p!=NULL;p = Next(p))
cout<<p->data<<endl;
}
void PostThread(TBTNode *p,TBTNode *&pre)
{
if (p!=NULL)
{
PostThread(p->lchild,pre);
PostThread(p->rchild,pre);
if (p->lchild==NULL)
{
p->lchild =pre;
p->ltag = 1;
}
if (pre!=NULL&& pre->rchild==NULL)
{
pre->rchild = p;
pre->rtag = 1;
}
pre = p;
}
}
void createPostThread(TBTNode *root)
{
if(root!=NULL)
{
TBTNode *pre =NULL;
PostThread(root,pre);
pre->rchild =NULL;
pre->rtag = 1;
}
}
int main()
{
/*
测试程序
*/
//is2operator(v,vv,ms);
TBTNode b1,b2,b3,b4,b5;
b1.data =1;
b1.lchild = &b2;
b1.rchild =&b3;
b2.lchild =&b4;
b2.rchild =&b5;
b2.data =2;
b3.data =3;
b3.lchild =NULL;
b3.rchild =NULL;
b4.data =4;
b4.lchild =NULL;
b4.rchild =NULL;
b5.data =5;
b5.lchild =NULL;
b5.rchild =NULL;
b1.rtag =0;
b1.ltag =0;
b2.rtag =0;
b2.ltag =0;
b3.rtag =0;
b3.ltag =0;
b4.rtag =0;
b4.ltag =0;
b5.rtag =0;
b5.ltag =0;
createPostThread(&b1);
system("pause");
}