二叉树的中序遍历

递归模板(简单)

基本思路:访问入口函数,放在两个递归函数之间

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;
            }                
        }
    }
}
原文地址:https://www.cnblogs.com/YC-L/p/12094679.html