树的链式存储
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild;
struct BiTNode *rchlid;
}BiTNode, *BiTree;
树的遍历
一、前序遍历
算法思想(递归过程):
- 访问根结点
- 先序遍历左子树
- 先序遍历右子树
//先序遍历的递归调用
void preTravel(BiTree T)
{
if(T != NULL)
{
printf("%d", T->data);
preTravel(T->lchild);
preTravel(T->rchlid);
}
}
//先序遍历的非递归调用
void preTravelStack (BiTree T)
{
BiTree p = T;
//p进栈
S[top++] = p;
while(p != NULL || top != 0)
{
if(p != NULL)
{
//进栈,访问,指向左子树
S[top++] = p;
printf("%d", p->data);
p = p->lchild;
}
else{
p = S[--top];
p = p->rchlid;
//出栈,指向右子树
}
}
}
二、中序遍历
算法思想(递归过程):
- 中序遍历左子树
- 访问根结点
- 中序遍历右子树
//中序遍历
void inTravel(BiTree T)
{
if(T != NULL)
{
inTravel(T->lchild);
printf("%c",T->data);
inTravel(T->rchlid);
}
}
//中序遍历的非递归调用
void inTravelStack(BiTree T)
{
BiTree p = T;
while(p || top != 0)
{
if(p != NULL)
{
//进栈,指向左子树
S[top++] = p;
p = p->lchild;
}
else{
//出栈,访问,指向右子树
p = S[--top];
printf("%c", p->data);
p = p->rchlid;
}
}
}
三、后序遍历
算法思想(递归过程):
- 后序遍历左子树
- 后序遍历右子树
- 访问根结点
//后序遍历
void postTravel(BiTree T)
{
if(T != NULL)
{
postTravel(T->lchild);
postTravel(T->rchlid);
printf("%d", T->data);
}
}
四、层次遍历
BiTree Q[N];
int rear, front;
//层次遍历(利用队列)
void levelTravel(BiTree T)
{
rear = front = 0;
BiTree q = T;
Q[rear++] = q;
printf("%c", q->data);
while(rear != front )
{
//出栈、进栈左子树和右子树,并访问
q = Q[front++];
if(q->lchild!=NULL)
{
Q[rear++] = q->lchild;
printf("%c", q->lchild->data);
}
if(q->rchlid!=NULL)
{
Q[rear++] = q->rchlid;
printf("%c", q->rchlid->data);
}
}
}
建立二叉树
//建立二叉链树,按先序次序输入二叉树中结点的值,空格字符表示空树。
void createBiTree(BiTree &T)
{
char ch;
scanf("%c", &ch);
if(ch == ' ')
T = NULL;
else{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
createBiTree(T->lchild);
createBiTree(T->rchlid);
}
}