非遞迴遍歷二叉樹的四種策略-先序、中序、後序和層序
遍歷二叉樹的遞迴演算法,是比較容易理解的,但是非遞迴的迴圈演算法不是很容易一眼看穿。下面的五個演算法是參考嚴蔚敏的《資料結構》和USTC的張昱老師的講義後,寫下來的,部分有改動。
先序遍歷二叉樹演算法1
// Copyright (c) 2009, ALex ZhonG. All rights reserved. Status PreOrderTraverse(BiTree T, Status (Visit *)(TElemType e)) { InitStack(S); Push(S, T); p = T;//或 GetTop(S, p); while(!StackEmpty(S) && p) { while(p) { if(!Visit(p->data)) return ERROR; Push(p->rchild); p = p->lchild; } Pop(S, p); } DestroyStack(S); return OK; }
先序遍歷二叉樹演算法2
// Copyright (c) 2009, ALex ZhonG. All rights reserved. Status PreOrderTraverse(BiTree T, Status (Visit *)(TelemType)) { InitStack(S); Push(S, T); p = T; while(!StackEmpty(S) && p) { while(p) { if(!Visit(p->data)) return ERROR; Push(S, p); p = p->lchild; } if(!StackEmpty(S)) { Pop(S, p); p = p->rchild; } } DestroyStack(S); return OK; }
中序遍歷二叉樹演算法
// Copyright (c) 2009, ALex ZhonG. All rights reserved. Status InOrderTraverse(BiTree T, Status (Visit *)(TelemType e)) { InitStack(S); Push(S, T)' p = T; while(!StackEmpty(S) && p) { while(p) { Push(S, p); p = p ->lchild; } Pop(S, p); if(!Visit(p->data)) return ERROR; p = p->rchild; } DestroyStack(S); return OK; }
後序遍歷二叉樹演算法
// Copyright (c) 2009, ALex ZhonG. All rights reserved. Status PostOrderTraverse(BiTree T, Status (Visit *)(TelemType e)) { InitStack(S); Push(S, T); p = T; while(!StackEmpty(S) && p) { if(p) {//一直走到最左下的結點 Push(S, p); p = p->lchild; } else {//p為NULL時 GetTop(S, p); if(p->rchild && p->rchild != r) {//p有右孩子或p的右孩子不是剛剛被訪問的 p = p->rchild; Push(S, p); p = p->lchild; } else {//p無右孩子或p右孩子剛剛被訪問過時 Pop(S, p); Visit(p->data); r = p; p = NULL; } } } DestroyStack(S); return OK; }
層序遍歷二叉樹演算法
// Copyright (c) 2009, ALex ZhonG. All rights reserved. Status LevelOrderTraverse(BiTree T, Status (Visit *)(TelemType e)) { InitQueue(Q); p = T; if(p) { if(!Visit(p->data) return ERROR; EnQueue(Q, p->lchild); EnQueue(Q, p->rchild); while(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; }
歡迎討論、批評和指正!
ALex ZhonG
相關文章
- 二叉樹的四種遍歷方法:先序,中序,後序,層序二叉樹
- 遞迴和迭代實現二叉樹先序、中序、後序和層序遍歷遞迴二叉樹
- 非遞迴實現先序遍歷和中序遍歷遞迴
- 非遞迴先序遍歷二叉樹遞迴二叉樹
- 二叉樹的前中後序遍歷(遞迴和非遞迴版本)二叉樹遞迴
- PHP基於非遞迴演算法實現先序、中序及後序遍歷二叉樹操作示例PHP遞迴演算法二叉樹
- 演算法 -- 實現二叉樹先序,中序和後序遍歷演算法二叉樹
- 二叉樹的前序、中序、後序三種遍歷二叉樹
- 二叉樹迭代器(中序遞迴、前序和後序遍歷)演算法二叉樹遞迴演算法
- 二叉樹中序和後序遍歷表示式二叉樹
- 二叉樹的先,中,後序遍歷二叉樹
- 二叉樹的先中後序遍歷二叉樹
- 二叉樹的建立、前序遍歷、中序遍歷、後序遍歷二叉樹
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- [java] 二叉樹的後序遍歷(遞迴與非遞迴實現)Java二叉樹遞迴
- 二叉樹建立,前序遍歷,中序遍歷,後序遍歷 思路二叉樹
- 【演算法】二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的遞迴和迭代實現記錄(Java版)演算法二叉樹遞迴Java
- 還原二叉樹(先序+中序-〉後序)二叉樹
- 二叉樹先知道後序和中序,求先序二叉樹
- 層序遍歷二叉樹二叉樹
- 二叉樹的層序遍歷二叉樹
- 二叉樹的前序,中序,後序遍歷方法總結二叉樹
- 二叉樹--後序遍歷二叉樹
- 二叉樹的前序、中序、後序的遞迴和迭代實現二叉樹遞迴
- 已知二叉樹的先序和後序求任意一中序二叉樹
- 從中序與後序遍歷序列構造二叉樹二叉樹
- 二叉樹的前中後序遍歷二叉樹
- python-二叉樹:前、中、後、層序遍歷Python二叉樹
- 先序、中序、後序序列的二叉樹構造演算法二叉樹演算法
- 刷題筆記:樹的前序、中序、後序遍歷筆記
- 388,先序遍歷構造二叉樹二叉樹
- 資料結構與演算法——二叉樹的前序遍歷,中序遍歷,後序遍歷資料結構演算法二叉樹
- 刷題系列 - Python用非遞迴實現二叉樹中序遍歷Python遞迴二叉樹
- Java中用遞迴和迭代實現二叉樹的中序( InOrder )遍歷Java遞迴二叉樹
- 二叉樹 前序、中序、後序二叉樹
- 根據二叉樹的先序序列和中序序列還原二叉樹並列印後序序列二叉樹
- 二叉樹(BST)中序遍歷的三種方法二叉樹
- 【二叉樹】前中序求後序,中後序求前序二叉樹