引用线索二叉树的目的
因为二叉链表中,假设有n个节点,指针指向为空的指针有n+1个,为了利用这些指针,引入了线索化的概念,而且为二叉链表加入线索化后,对二叉树的遍历便的很方便。
加线索化分为:前序线索化,中序线索化,后序线索化。
如果不理解,请参考这个博客,写的非常详细:http://blog.youkuaiyun.com/my_heart_/article/details/52086321
实现的代码如下:
//为二叉链表加前序线索化 (不带头节点)
#include <iostream>
using namespace std;
//线索化的结构体
typedef struct Node
{
char data;
int ltag;
int rtag;
struct Node *lchild;
struct Node *rchild;
}*BiTree;
//pre为前驱节点。为全局变量 ,初始化时右子树为空
BiTree pre;
//前序实现创建二叉树
void createBiTree(BiTree &Tree)
{
char data;
cin>>data;
if(data=='#')
{
Tree = NULL;
}
else
{
Tree = new Node();
Tree->data = data;
// Tree->ltag = 0;
// Tree->rtag=0;
createBiTree(Tree->lchild);
createBiTree(Tree->rchild);
}
}
//前序线索化的实现
void function(BiTree &Tree,BiTree &pre)
{
if(Tree)
{
if(Tree->lchild==NULL)
{
Tree->ltag=1;
Tree->lchild=pre;
}
else
{
Tree->ltag=0;
}
if(pre->rchild==NULL)
{
pre->rtag=1;
pre->rchild=Tree;
}
else
{
Tree->rtag=0;
}
pre = Tree;
if(Tree->ltag==0)
{
function(Tree->lchild,pre);
}
if(Tree->rtag==0)
{
function(Tree->rchild,pre);
}
}
}
//前序遍历 根左右
void preBiTree(BiTree Tree)
{
if(Tree==NULL)
{
cout<<"是空数\n";
exit(1);
}
while(Tree!=NULL)
{
while(Tree->lchild!=NULL&&Tree->ltag==0)
{
cout<<Tree->data<<" ";
Tree = Tree->lchild;
}
cout<<Tree->data<<" ";
if(Tree->ltag==1)
{
Tree = Tree->rchild;
}
while(Tree!=NULL)
{
if(Tree->lchild!=NULL&&Tree->ltag==0)
{
break;
}
cout<<Tree->data<<" ";
Tree = Tree->rchild;
}
}
}
int main()
{
BiTree Tree;
cout<<"请输入你要创建的二叉树的数据(按先序遍历创建的二叉树#为空节点的表示)\n";
createBiTree(Tree);
pre = new Node();
pre->lchild=NULL;
function(Tree,pre);
preBiTree(Tree);
return 0;
}