非递归先、中、后序遍历二叉树(C语言)
非递归先、中、后序遍历二叉树(C语言) 本文档详细介绍了非递归遍历二叉树的算法,包括先序遍历、中序遍历和后序遍历三种方法。这些算法都是基于C语言编写的,并使用了栈和二叉树的基本操作函数。这些函数基于严蔚敏老师的《数据结构(C语言版)》(清华大学出版社)一书,但参数的传递使用的是C语言中的二级指针,而不是C++中的引用。在CodeBlocks的C语言运行环境下无错误。 一、非递归遍历算法 1. 先序遍历 非递归先序遍历的算法是:根结点入栈后立即出栈,然后访问根结点并对其右孩子进行判空。如果右孩子不为空,右孩子入栈,然后遍历左子树;如果为空,直接遍历左子树。然后循环这个过程直到左子树为空,退出循环。然后栈中元素出栈,循环这个过程直至栈空。 2. 中序遍历 非递归中序遍历的算法是:根结点入栈,遍历左子树,循环这个过程直至左子树为空,然后根结点出栈,访问根结点并遍历右子树。如果右子树为空,循环这个过程;否则,右子树入栈,遍历右子树。 3. 后序遍历 非递归后序遍历的算法是:根结点入栈,遍历左子树,循环这个过程直至左子树为空,然后根结点出栈,并对其右孩子判空。如果右孩子为空,访问根结点,然后循环这个过程;否则,右孩子入栈,遍历右子树。然后循环这个过程直至右孩子为空。然后栈中元素出栈,并判断其是否为第二次出栈的右孩子非空的根结点。如果是,访问根结点,然后循环这个过程;否则,对其右孩子进行判空,判断结果同上。 二、完整程序 ``` //先序遍历 Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType e)) { SqStack q,*S; S = &q; InitStack(S); BiTree p; p = T; Push(S,T); while(!StackEmpty(S)) { Pop(S,&p); while(p) { if(!Visit(p->data)) return ERROR; if(p->rchild) { Push(S,p->rchild); } p = p->lchild; } } return OK; } //中序遍历 Status InOrderTraverse(BiTree T, Status (*Visit)(TElemType e)) { SqStack q,*S; S = &q; InitStack(S); BiTree p; p = T; while(p || !StackEmpty(S)) { if(p) { Push(S,p); p = p->lchild; } else { Pop(S,&p); if(!Visit(p->data)) return ERROR; } } return OK; } //后序遍历 Status PostOrderTraverse(BiTree T, Status (*Visit)(TElemType e)) { SqStack q,*S; S = &q; InitStack(S); BiTree p; p = T; while(p || !StackEmpty(S)) { if(p) { Push(S,p); p = p->lchild; } else { Pop(S,&p); if(p->rchild) { Push(S,p->rchild); } else { if(!Visit(p->data)) return ERROR; } } } return OK; } ``` 三、运行结果实例 本文档提供了完整的程序代码和详细的算法解释,可以帮助读者更好地理解非递归遍历二叉树的算法,并且可以根据需要进行修改和优化。