二叉树的中序遍历
递归模板(简单)
基本思路:访问入口函数,放在两个递归函数之间
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; } } } }
论读书
睁开眼,书在面前 闭上眼,书在心里
睁开眼,书在面前 闭上眼,书在心里