博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树的先序后序中序遍历(递归非递归)
阅读量:2352 次
发布时间:2019-05-10

本文共 4806 字,大约阅读时间需要 16 分钟。

二叉树先序遍历算法

//递归Status PreOrderTraverse1(BiTree T){     if  (T)  {           if ( visit(T->data) ) {               if (T->lchild)                   if  ( ! PreOrderTraverse1(T->lchild) ) return ERROR;               if (T->rchild)                  if  (! PreOrderTraverse1(T->rchild) )  return ERROR;               return OK;           }else return ERROR;       }else return OK; } //PreOrderTraverse1//非递归void PreOrderWithoutRecursion1(BTNode* root){    if (root == NULL)        return;    BTNode* p = root;    stack
s; while (!s.empty() || p) { //边遍历边打印,并存入栈中,进入右子树 while (p){ visit(p->data); s.push(p); p = p->lchild; } //当p为空时,说明根和左子树都遍历完了,该进入右子树了 p = s.top(); s.pop(); p = p->rchild; } cout << endl;}void PreOrderWithoutRecursion2(BTNode* root){ if (root == NULL) return; BTNode* p = root; stack
s; while (!s.empty() || p) { if (p){ visit(p->data); s.push(p); p = p->lchild; } else{ p = s.top(); s.pop(); p = p->rchild; } } cout << endl;}

二叉树中序遍历算法

//递归Status  InOrderTraverse(BiTree T, Status(* Visit)(TElemType e)){   if  (T){           if  ( InOrderTraverse(T->lchild, Visit) )            if ( Visit(T->data) )                if   ( InOrderTraverse(T->rchild,Visit) )                      return OK;        return ERROR;    }else         return OK; } //InOrderTraverse//中序遍历void InOrderWithoutRecursion1(BTNode* root){    //空树    if (root == NULL)        return;    //树非空    BTNode* p = root;    stack
s; while (!s.empty() || p) { //一直遍历到左子树最下边,边遍历边保存根节点到栈中 while (p){ s.push(p); p = p->lchild; } //当p为空时,说明已经到达左子树最下边,这时需要出栈了 p = s.top(); s.pop(); visit(p->data); //进入右子树,开始新的一轮左子树遍历 p = p->rchild; }}//中序遍历void InOrderWithoutRecursion2(BTNode* root){ //空树 if (root == NULL) return; //树非空 BTNode* p = root; stack
s; while (!s.empty() || p) { if (p){ s.push(p); p = p->lchild; } else{ p = s.top(); s.pop(); cout << setw(4) << p->data; p = p->rchild; } }}

二叉树后序遍历

//递归Status PostOrderTraverse(BiTree T,Status(* Visit)(TElemType e)){    if  (T)    {           if  ( PostOrderTraverse(T->lchild, Visit) )            if   ( PostOrderTraverse(T->rchild, Visit) )                if ( Visit(T->data) )                        return OK;        return ERROR;    }else         return OK; } //PostOrderTraverse//非递归//后序遍历void PostOrderWithoutRecursion(BTNode* root){    if (root == NULL)        return;    stack
s; //pCur:当前访问节点,pLastVisit:上次访问节点 BTNode* pCur, *pLastVisit; //pCur = root; pCur = root; pLastVisit = NULL; //先把pCur移动到左子树最下边 while (pCur) { s.push(pCur); pCur = pCur->lchild; } while (!s.empty()) { //走到这里,pCur都是空,并已经遍历到左子树底端(看成扩充二叉树,则空,亦是某棵树的左孩子) pCur = s.top(); s.pop(); //一个根节点被访问的前提是:无右子树或右子树已被访问过 if (pCur->rchild == NULL || pCur->rchild == pLastVisit) { cout << setw(4) << pCur->data; //修改最近被访问的节点 pLastVisit = pCur; } /*这里的else语句可换成带条件的else if: else if (pCur->lchild == pLastVisit)//若左子树刚被访问过,则需先进入右子树(根节点需再次入栈) 因为:上面的条件没通过就一定是下面的条件满足。仔细想想! */ else { //根节点再次入栈 s.push(pCur); //进入右子树,且可肯定右子树一定不为空 pCur = pCur->rchild; while (pCur) { s.push(pCur); pCur = pCur->lchild; } } } cout << endl;}Status PostOrderTraverse1(BiTree T){ InitStack(S); Push (S,{T,0}); //根结点(指针、mark)入栈 while(!StackEmpty(S)) { Pop(S,a); switch(a.mark){ case 0: Push(S,{a.p, 1}); //修改mark域 if(a.p->lchild) Push(S,{a.p->lchild,0}); //访问左子树 break; case 1: Push(S,{a.p,2}); //修改mark域 if(a.p->rchild) Push(S,{a.p->rchild,0}); //访问右子树 break; case 2: if (!visit( a.p->data)) return ERROR; } } return OK;}//PostOrderTraverse1

二叉树按层次遍历算法

Status  LevelOrderTraverse(BiTree T, Status(* Visit)(TElemType e)){   if (T)  {             InitQueue(Q);             EnQueue(Q, T);         //根结点的指针T入队列             while ( ! QueueEmpty (Q) )             {    DeQueue(Q, p);  //从队头取一个指针                   if ( !Visit(p->data) )   return ERROR;                    if (p->lchild)  EnQueue(Q, p->lchild);                   if (p->rchild)  EnQueue(Q, p->rchild);             }     }     return OK;} //LevelOrderTraverse

转载地址:http://harvb.baihongyu.com/

你可能感兴趣的文章
CSS hack 收集
查看>>
Markdown 语法
查看>>
前端工程师面试考察要点
查看>>
前端面试题——js闭包
查看>>
阿里实习生面试——电面1
查看>>
保留小数点后两位
查看>>
js使用栈来实现10进制转8进制 js取除数 余数
查看>>
myeclipse 红色叹号的原因
查看>>
前端那些事儿——中文乱码,网页中文乱码,网页乱码,块元素,内联元素
查看>>
XML与HTML区别,XML解析
查看>>
http请求(get 和 post 请求)与响应
查看>>
jsp、el、jstl——前端面试
查看>>
java IO流
查看>>
Column count doesn't match value count at row 1
查看>>
WIN7系统去掉桌面小图标
查看>>
页面优化——js异步加载
查看>>
js数组——思维导图
查看>>
CSS3渐变
查看>>
CSS实现居中的7种方法
查看>>
Python-Web运行环境搭建中遇到的问题-(ImportError: No module named setuptools)
查看>>