JumpNode递归和非递归访问
2015-03-04 22:54
211 查看
JumpNode的定义结构为如下所示:
struct JumpNode { int data; //存储数据 int order; // 记录访问次序,初始化均为0 JumpNode *jump, *next; // next为线性下一节点,jump为跳跃到下一节点 JumpNode(int d): data(d), order(-1), jump(NULL), next(NULL) {} };
现在需要以递归和非递归的方式来访问到一个JumpNode *list。在访问的时候给各个节点的order属性记录上访问的次序。
递归访问
void recursive_traversal(JumpNode *node, int &order) { if (node == NULL || node->order != -1) return; node->order = order++; recursive_traversal(node->jump, order); recursive_traversal(node->next, order); }
非递归访问
void iterative_traversal(JumpNode *node, int &order) { JumpNode *curr = node; stack<JumpNode *> s; while (!s.empty() || (curr && curr->order==-1)) { if (curr && curr->order == -1) { curr->order = order++; s.push(curr); curr = curr->jump; } else { curr = s.top(); s.pop(); curr = curr->next; } } }
测试部分
测试时使用如下函数对链表进行打印:
void print(JumpNode *node) { while (node) printf("(%d,%d) ", node->data, node->order), node = node->next; printf("\n"); }
链表结构为:
JumpNode *n1 = new JumpNode(1); JumpNode *n2 = new JumpNode(2); JumpNode *n3 = new JumpNode(3); JumpNode *n4 = new JumpNode(4); n1->jump = n3; n2->jump = n4; n3->jump = n2; n4->jump = n4; n1->next = n2; n2->next = n3; n3->next = n4;
最后打印结果均为:
[root@localhost cpp]# ./jumpnode (1,1) (2,3) (3,2) (4,4)
关于非递归访问
可见,针对递归访问改造的话,将recursive_traversal内部的条件(node != NULL && node->order == -1) 设置为iterative_traversal 进行左支(if分支)访问的条件。并且在左支(if分支)内可以执行前序遍历的特定语句;
至于中序访问特定语句则放置于非递归版本的else分支中即可。
相关文章推荐
- Coding interview: 二叉树的遍历(递归和非递归)
- Node+Express的跨域访问控制问题:Access-Control-Allow-Origin
- [置顶] 二叉树的操作--递归与非递归
- JavaShowAlgorithm-hanoi的递归和非递归
- 如何用栈实现递归与非递归的转换(一)三种遍历树的算法
- node.js 访问redis数据库,pub/sub
- 背包问题的递归和非递归的解法
- ngrok集成在本地Node.js项目服务器,实现F5调试即可自动打开浏览器且通过外网可访问本地服务器。
- 求字符串长度之递归与非递归的C语言实现
- node.js递归打印文件目录、文件名
- leetcode 144. Binary Tree Preorder Traversal-前序遍历|递归|非递归
- 递归和非递归详解
- 最大子数组问题的递归和非递归(线性时间)代码
- 二叉树的遍历(递归与非递归)
- node.js设置跨域访问header
- 树的递归遍历和非递归遍历源码(C++)
- 递归与非递归
- ajax访问Node服务器
- n!和 Fibnoacci函数的递归与非递归
- 实现二分查找算法的递归及非递归