二叉树的先序后序中序遍历(递归非递归)
来源:互联网 发布:淘宝运营助理是干什么 编辑:程序博客网 时间:2024/06/08 06:22
二叉树先序遍历算法
//递归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<BTNode*> s; while (!s.empty() || p) { //边遍历边打印,并存入栈中,进入右子树 while (p) { visit(p->data); s.push(p); p = p->lchild; } //当p为空时,说明根和左子树都遍历完了,该进入右子树了 if (!s.empty()) { p = s.top(); s.pop(); p = p->rchild; } } cout << endl;}void PreOrderWithoutRecursion2(BTNode* root){ if (root == NULL) return; BTNode* p = root; stack<BTNode*> 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<BTNode*> s; while (!s.empty() || p) { //一直遍历到左子树最下边,边遍历边保存根节点到栈中 while (p) { s.push(p); p = p->lchild; } //当p为空时,说明已经到达左子树最下边,这时需要出栈了 if (!s.empty()) { p = s.top(); s.pop(); visit(p->data); //进入右子树,开始新的一轮左子树遍历 p = p->rchild; } }}//中序遍历void InOrderWithoutRecursion2(BTNode* root){ //空树 if (root == NULL) return; //树非空 BTNode* p = root; stack<BTNode*> 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<BTNode*> 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
0 0
- 二叉树的先序后序中序遍历(递归非递归)
- 二叉树的遍历(递归+非递归+层次遍历)
- 二叉树的递归,非递归遍历
- 二叉树的递归+非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的遍历--递归+非递归
- 二叉树的递归、非递归遍历
- 二叉树的递归非递归遍历
- 二叉树遍历(递归,非递归)
- 二叉树的遍历(非递归)
- 二叉树的遍历(非递归)
- 二叉树的遍历(非递归)
- 二叉树的遍历(递归实现+非递归实现)
- 二叉树的三种遍历(递归+非递归)
- 二叉树的遍历(递归与非递归)
- 二叉树的遍历(递归 and 非递归)
- 二叉树的遍历(递归、非递归)
- 二叉树的遍历(递归、非递归) java
- 【软考总结】——好事多磨
- ln命令介绍
- Cannot open /var/log/sa/sa23: No such file or directory
- 20、Spring MVC 之 Configuring
- iOS开发中, '-[__NSCFConstantString size]: unrecognized selector sent to instance 0x10abccc00'
- 二叉树的先序后序中序遍历(递归非递归)
- 4、Spring MVC实操
- 30天自制操作系统U盘启动
- 【C语言】函数的传值与传地址区别
- 请求分页系统工作机制
- 了解JavaScript中的prototype
- Gradle files have changed since last project sync.问题的解决办法
- 免费的 webservice 接口服务地址
- ArrayList练习 ,去重