二叉树的链表结构
typedef Struct TNode *Position;
typedef Position BinTree;
struct TNode
{
ElementType Data;
BinTree Left;
BinTree Right;
}
类型名称:二叉树(BinTree)
数据对象集:一个有穷的结点集合。由根结点和左右二叉子树组成
操作集:
1.二叉树的遍历
(1)中序遍历(左-根-右)(第二次遇到输出)
void InorderTraversal(BinTree BT)
{
if(BT)
{
/*假设数据为整型且对BT结点的访问就是打印数据*/
InorderTraversal(BT->Left);
printf("%d",BT->Data);
InorderTraversal(BT->Right);
}
}
(2)先序遍历(第一次遇到输出)
void PreorderTraversal(BinTree BT)
{
if(BT)
{
/*假设数据为整型且对BT结点的访问就是打印数据*/
printf("%d",BT->Data);
InorderTraversal(BT->Left);
InorderTraversal(BT->Right);
}
}
(3)后序遍历(第三次遇到输出)
void PostorderTraversal(BinTree BT)
{
if(BT)
{
/*假设数据为整型且对BT结点的访问就是打印数据*/
InorderTraversal(BT->Left);
InorderTraversal(BT->Right);
printf("%d",BT->Data);
}
}
(4)非递归中序遍历(堆栈)
void InorderTraversal(BinTree BT)
{
BinTree T;
Stack S=CreateStack();
T=BT;
while(T||IsEmpty(S))
{
while(T)
{
Push(S,T);
T=T->Left;
}
T=Pop(S);
peintf("%d",T->Data);
T=T->Right;
}
}
(5)层序遍历
void LeveLorderTraversal(BinTree BT)
{
Queue Q;
BinTree T;
if(!BT)return;
Q=CreatQueue();
AddQ(Q,BT);
while(!IsEmpty(Q))
{
T=DeleteQ(Q);
printf("%d",T->Data);
if(T->Left) AddQ(Q,T->Left);
if(T->Right) AddQ(Q,T->Right);
}
}
2.二叉树的创建
typedef int ElementType; /*假设结点数据为整数*/
#define NOInfo 0; /*用0表示没有结点*/
BinTree CreatBinTree()
{
ElementType Data;
BinTree BT,T;
Queue Q=CreatQueue();
scanf("%d",&Data);
if(Data!=NoInfo)
{
BT=(BinTree)malloc(sizeof(sturct TNode));
BT->Data=Data;
BT->Left=BT->Right=NULL; /*把两个子结点设为空*/
AddQ(Q,BT);
}
else return NULL;
while(!IsEmpty(Q))
{
T=DeleteQ(Q); /*从队列中取出一结点地址*/
scanf("%d",&Data);
if(Data==NoInfo)T->Left=NULL;
else /*分配新结点,作为出队结点左孩子;新结点入队*/
{
T->Left=(BinTree)malloc(sizeof(sturct TNode));
T->Left->Data=Data;
T->Left->Left=T->Left->Right=NULL;
AddQ(Q,T->Left);
}
scanf("%d",&Data);
if(Data==NoInfo)T->Right=NULL;
else /*分配新结点,作为出队结点右孩子;新结点入队*/
{
T->Right=(BinTree)malloc(sizeof(sturct TNode));
T->Right->Data=Data;
T->Right->Left=T->Right->Right=NULL;
AddQ(Q,T->Right);
}
}
return BT;
}