遍历二叉树的非递归实现
2015-11-16 22:34
363 查看
对于二叉树来说,只要按照下面的模板可以很容易地实现先序、中序和后序的递归遍历二叉树。
使用递归可以使代码变得简洁,明了。我们不用考虑计算机底层的递归工作栈是怎么实现的,只要写好递归式,给出递归终止条件,就可以把剩余的计算工作交给计算机去执行。所以说递归是个好东东啊。但是追求真相的人,往往不会满足于此的,一定弄明白背后的工作原理。
哈哈这就是古人云:"不可去名上理会。须求其所以然。"
OK,下面我把今晚写的遍历二叉树的非递归算法分享一下。
由于时间原因,没有来得及加注释,以后补上。
void visit(TreeNode *node) { //operation 1 if (node->leftChild != nullptr) visit(node->leftChild); //operation 2 if (node->rightChild != nullptr) visit(node->rightChild); //operation 3 }
使用递归可以使代码变得简洁,明了。我们不用考虑计算机底层的递归工作栈是怎么实现的,只要写好递归式,给出递归终止条件,就可以把剩余的计算工作交给计算机去执行。所以说递归是个好东东啊。但是追求真相的人,往往不会满足于此的,一定弄明白背后的工作原理。
哈哈这就是古人云:"不可去名上理会。须求其所以然。"
OK,下面我把今晚写的遍历二叉树的非递归算法分享一下。
TreeNode *assistStack[MAXSIZE];//辅助栈模拟系统的递归工作栈 bool visited[MAXSIZE] = { false };//设置访问标志位 void visit(char value) { printf("%c ", value); } void preOrderOfNonRecurrence(TreeNode *root) { int top = -1; TreeNode *rNode = root; visit(rNode->value); assistStack[++top] = rNode; while (rNode->leftChild != nullptr) { rNode = rNode->leftChild; printf("%c ", rNode->value); assistStack[++top] = rNode; } while (top != -1) { if (assistStack[top]->rightChild != nullptr) { rNode = assistStack[top]->rightChild; top--; printf("%c ", rNode->value); while (rNode->leftChild != nullptr) { rNode = rNode->leftChild; printf("%c ", rNode->value); assistStack[++top] = rNode; } } else { top--; } } } void inOrderOfNonRecurrence(TreeNode *root) { TreeNode *rNode = root; int top = -1; assistStack[++top] = rNode; while (rNode->leftChild != nullptr) { rNode = rNode->leftChild; assistStack[++top] = rNode; } while (top != -1) { rNode = assistStack[top--]; visit(rNode->value); if (rNode->rightChild != nullptr) { rNode = rNode->rightChild; assistStack[++top] = rNode; while (rNode->leftChild != nullptr) { rNode = rNode->leftChild; assistStack[++top] = rNode; } } } } void postOrderOfRecurrence(TreeNode *root) { TreeNode* rNode = root; int top = -1; assistStack[++top] = rNode; visited[top] = false; while (rNode->leftChild != nullptr) { rNode = rNode->leftChild; assistStack[++top] = rNode; visited[top] = false; } while (top != -1) { rNode = assistStack[top]; visited[top] = true; if (rNode->rightChild != nullptr) { rNode = rNode->rightChild; assistStack[++top] = rNode; visited[top] = false; while (rNode->leftChild != nullptr) { rNode = rNode->leftChild; assistStack[++top] = rNode; visited[top] = false; } } while (visited[top] == true && top != -1) { visit(assistStack[top]->value); top--; } } }
由于时间原因,没有来得及加注释,以后补上。
相关文章推荐
- 三栏布局(两边固定,中间自适应)
- Python特殊语法:filter、map、reduce、lambda
- 集合划分问题(一)
- 【大话GSM】MS计算寻呼信道、寻呼子信道以及确定在何时监听
- UI基础-设计模式、手势识别器
- 1036 Boys vs Girls
- Ubuntu 之 grub 引导方法
- c#下crystalreport自定义纸张报表打印
- 数据挖掘之权重计算(PageRank)
- HTTP2 学习
- Asia Regional Contest, Tokyo,Problem C Shopping
- [LeetCode-205] Isomorphic Strings(同构字符串)
- 查看job的详细日志出错: Aggregation is not enabled. Try the nodemanager at d2.hadoop:42812
- Lingo中命令脚本文件使用范例
- 递归函数
- 南大软院大神养成计划——第一天学习心得
- 基于RMI实现远程聊天功能的简单例子
- VirtualPathProvider的使用
- 线程安全
- 从巴黎的恐怖袭击看以色列如何用大数据进行反恐