JumpNode递归和非递归访问

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

时间: 2024-10-29 19:07:13

JumpNode递归和非递归访问的相关文章

二叉树遍历递归与非递归实现

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 二叉树遍历是二叉树中非常基础的部分,也是学习二叉树必须熟练掌握的部分,下面我们先给出二叉树三种遍历方式的定义,并通过举例来说明二叉树遍历的过程. 二叉树的遍历分为:前序遍历(也叫先序遍历).中序遍历.后序遍历.所谓前.中.后都是根据当前子树根结点相对左右孩子的位置而言,也就是说: 前序遍历:根结点在前,即:根 ----->左------->右: 中序遍历:根结点在中间,即:左------>根------>右: 后序遍历:根结点在最

树的递归与非递归遍历总结

树的递归遍历遍历很简单,非递归遍历要复杂一些,非递归先序.中序.后序遍历需要用一个辅助栈,而层次遍历则需要一个辅助队列. 树的结构: 1 public class Tree<T> { 2 private T data; 3 private Tree<T> left; 4 private Tree<T> right; 5 ... 6 } 用策略模式定义一个访问工具: 1 public interface Visitor<T> { 2 void process(

二叉树三种遍历(递归以及非递归实现)

package com.shiyeqiang.tree; import java.util.Stack; public class BiTree { public static void main(String[] args) { // 首先构造叶子节点 BiTree leafA1 = new BiTree(4); BiTree leafA2 = new BiTree(5); BiTree leafB1 = new BiTree(6); BiTree leafB2 = new BiTree(7)

二叉树遍历算法总结(递归与非递归)

一:前言 二叉树的遍历方法分四种:前序,中序,后序以及层次遍历. 其中,前中后遍历方法的实现分递归和非递归,非递归遍历的实现需要借助于栈. 实际上,递归的调用就是一种栈的实现,所以,非递归遍历就需要人工借助栈结构来实现. 而层次遍历需要借助队列. 二:前中后序遍历 递归遍历: 递归遍历的思想和方法很简单,通过调整输出语句来实现前,中,后三种遍历. 代码如下: 1 void show(BiTree T) 2 { 3 if(T) 4 { 5 printf("%c ",T->data)

二叉树递归与非递归遍历,最近公共父节点算法

#include <iostream> #include <stack> using namespace std; #define MAX 100 //字符串最大长度 typedef struct Node //二叉树结点 { char data; Node *lchild,*rchild; } *Btree; void createBT(Btree &t); //先序构造二叉树 void preorder(Btree &t); //二叉树递归先序遍历 void i

递归与非递归及其相互转换

一.什么是递归 递归是指某个函数直接或间接的调用自身.问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求出,这些子问题的解就构成里原问题的解了. 二.递归的几个特点 1.递归式,就是如何将原问题划分成子问题. 2.递归出口,递归终止的条件,即最小子问题的求解,可以允许多个出口. 3.界函数,问题规模变化的函数,它保证递归的规模向出口条件靠拢 三.递归的运做机制 很明显,很多问题本身固有的性质就决定此类问题是递归定义,所以递归程序很直接算法程序结构清晰.思路明了.

简单迷宫算法(递归与非递归C++实现)

假定迷宫如下:1代表墙,0代表道路,起点在(1,1),终点(11,9)(PS:下标从0开始计算). 现在寻求一条路径能从起点到达终点(非最短). 有两种解法:递归与非递归. 递归算法思路: 要用递归,就要寻找一个子问题,该子问题是递归的.很明显,这道题的子问题就是从8个方向(上下左右还有四个斜角)中寻找一个可行方向并向前走一步,该子问题(seekPath函数)的实现代码如下: 1 struct offset{ 2 int x; 3 int y; 4 }; 5 offset move[8]={{-

二叉树的前序、中序、后序遍历(递归、非递归)实现

本文部分来源于CSDN兰亭风雨大牛的原创.链接为http://blog.csdn.net/ns_code/article/details/12977901 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的).下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍

二叉树的递归和非递归遍历

// 本次练习的是  二叉树的  递归和非递归  遍历   以及二叉树的  节点数  高度  叶子节点数   和查找功能  //如果要是变量在函数栈回归时不回归原值,则可以用引用// #define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<stack>#include<queue>using namespace std; template<class T>struct BinaryTreeNod