码迷,mamicode.com
首页 > 其他好文 > 详细

JumpNode递归和非递归访问

时间:2015-03-05 00:25:09      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:结构   数据   递归   非递归   

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分支中即可。

JumpNode递归和非递归访问

标签:结构   数据   递归   非递归   

原文地址:http://blog.csdn.net/nisxiya/article/details/44067779

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!