树的存储结构
/*******双亲表示法*/
typedef struct _TNode
{
TElemType data;
int parent;
}TNode;
typedef struct _SqTree
{
TElemType data[MAXSIZE];
int r,n;/*根结点和结点数*/
}SqTree;
/*孩子表示法*/
/*孩子结点*/
typedef struct _CNode
{
int index,
struct _CNode *next;
}CNode,*CNodePtr;
/*表头结构*/
typedef struct _PNode
{
TElemType data;
CNodePtr firstchild;
}PNode;
typedef struct _SqTree
{
TElemType data[MAXSIZE];
int r,n;/*根结点和结点数*/
}SqTree;
/*孩子兄弟表示法*/
typedef struct _Node
{
TElemType data;
struct _Node *firstchild,*rightsib;
}Node;
/*二叉链表*/
typedef struct _Node
{
TElemType data;
struct _Node *lchild,*rchild;
}Node,*NodePtr;
/*二叉树链表遍历*/
//前序
void PreOrderTraverse(NodePtr p)
{
if(p==NULL)
return;
printf("%d",p->data);
PreOrderTraverse(p->lchild);
PreOrderTraverse(p->rchild);
}
//中序
void InOrderTraverse(NodePtr p)
{
if(p==NULL)
return;
InOrderTraverse(p->lchild);
printf("%d",p->data);
InOrderTraverse(p->rchild);
}
//后序
void InOrderTraverse(NodePtr p)
{
if(p==NULL)
return;
InOrderTraverse(p->lchild);
InOrderTraverse(p->rchild);
printf("%d",p->data);
}
/*创建扩展二叉树*/
void CreateBitTree(NodePtr *t)
{
char input;
scanf("%c",&input);
if(input=='#')
{
*t=NULL;
}
else
{
*t=(NodePtr)malloc(sizeof(Node));
if(!*t)
{
return;
}
(*t)->data=input;
CreateBitTree(&(*t)->lchild);
CreateBitTree(&(*t)->rchild);
}
}
/*线索化二叉树*/
typedef struct _Node
{
TElemType data;
struct _Node *lchild,*rchild;
int ltag,rtag;//0表示指针指孩子 1 表示指针指向前驱或后继
}Node,*NodePtr;
NodePtr pre;
void InitThread(NodePtr p)
{
if(p)
{
InitThread(p->lchild);
if(!p->lchild)
{
p->lchild=pre;
p->ltag=0;
}
if(!pre->rchild)
{
pre->rchild=p;
pre->rtag=0;
}
pre=p;
InitThread(p->rchild);
}
}