递归模板(简单)
基本思路:访问入口函数,放在两个递归函数之间
void InOrder(BiTree T){
if(T != NULL){
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
}
非递归模板(效率高)
基本思路:
-
初始化一个栈,从根结点遍历左孩子一直到树叶,全部压入栈
-
判断栈不为空,输出栈顶结点,然后从输出的当前结点的右孩子开始遍历
-
重复以上步骤直到栈为空或者子树为空
// 中序遍历模板
void InOrderNonrecursion(BTNode *bt){
if(bt != NULL){
BTNode *Stack[maxSize]; // 初始化栈
int top = -1;
BTNode *p;
p = bt;
while(top != -1 || p != NULL){ // 空栈而且子树遍历完结束循环
while(p != NULL){ // 左孩子不为空,左孩子进栈,一直到左孩子为空
Stack[++top] = p;
p = p->lchild;
}
if(top != -1){ // 若堆栈不空,出栈并输出出栈结点,访问节点,将p指向右孩子
p = Stack[top--];
Visit(p);
p = p->rchild;
}
}
}
}