目录
一、DLR先序遍历
1.1 算法实现
void InOrder(BiTree root, CALLBACK Visit) {
Stack s, *S = &s;
BiTree p;
InitStack(S);
p = root;
while (p != NULL || !IsEmpty(S)) {
if (p != NULL) {
Visit(p->data);
Push(S, &p); /* 留下面包屑 */
p = p->LChild;
} else {
Pop(S, &p); /* 弹出结点,由p来指向 */
p = p->RChild;
}
}
ClearStack(S);
}
1.2 算法思想
二、LDR中序遍历
2.1 算法实现
void InOrder(BiTree root, CALLBACK Visit) {
Stack s, *S = &s;
BiTree p;
InitStack(S);
p = root;
while (p != NULL || !IsEmpty(S)) {
if (p != NULL) {
Push(S, &p); /* 留下面包屑 */
p = p->LChild;
} else {
Pop(S, &p); /* 弹出结点,由p来指向 */
Visit(p->data);
p = p->RChild;
}
}
ClearStack(S);
}
2.2 算法思想
三、LRD后序遍历
与先序、中序遍历算法的区别:
1、增加结点指针q对已访问的结点进行标记,避免重复访问。
2、使用GetTop函数获取栈顶结点,避免一次性弹出后无法返回到子树根结点。
3.1 算法实现
void PostOrder(BiTree root, CALLBACK Visit) {
BiTNode *p, *q;
Stack s, *S = &s;
q = NULL;
p = root;
InitStack(S);
while (p != NULL || !IsEmpty(S)) {
if (p != NULL) {
Push(S, &p); /* 留下面包屑 */
p = p->LChild;
} else {
GetTop(S, &p); /* 获取栈顶结点 */
if (p->RChild == NULL || p->RChild == q) {
Visit(p->data);
q = p; /* 对已访问结点进行标记 */
Pop(S, &p); /* 同时弹出已访问结点 */
p == NULL;
} else {
p = p->RChild;
}
}
}
ClearStack(S);
}