不使用递归和栈实现二叉树的中序遍历

原创 2015年07月06日 17:45:05

不使用递归和栈实现二叉树的中序遍历
总体思路:
主要问题:不使用递归及栈,就无法回到当前节点的父节点。
解决办法:
1.在每一个节点中添加一个指向父节点的的指针
2.让以下一个节点为根的树的最右节点指向当前节点。
下面是第二种方法的代码及解析。
节点指针图片示意:
这里写图片描述

源代码如下(C语言实现)
源码出处:http://www.acmerblog.com/inorder-tree-traversal-without-recursion-and-without-stack-5988.html

#include<stdio.h>
#include<stdlib.h>

struct tNode
{
   int data;
   struct tNode* left;
   struct tNode* right;
};

void MorrisTraversal(struct tNode *root)
{
  struct tNode *current,*pre;

  if(root == NULL)
     return; 

  current = root;
  while(current != NULL)
  {                 
    if(current->left == NULL)
    {
      printf(" %d ", current->data);
      current = current->right;      
    }    
    else
    {
      /* 找到current的前驱节点 */
      pre = current->left;
      while(pre->right != NULL && pre->right != current)
        pre = pre->right;

      /* 将current节点作为其前驱节点的右孩子 */
      if(pre->right == NULL)
      {
        pre->right = current;
        current = current->left;
      }

      /* 恢复树的原有结构,更改right 指针 */   
      else 
      {
        pre->right = NULL;
        printf(" %d ",current->data);
        current = current->right;      
      } /* End of if condition pre->right == NULL */
    } /* End of if condition current->left == NULL*/
  } /* End of while */
}

struct tNode* newtNode(int data)
{
  struct tNode* tNode = (struct tNode*)
                       malloc(sizeof(struct tNode));
  tNode->data = data;
  tNode->left = NULL;
  tNode->right = NULL;

  return(tNode);
}

/* 测试*/
int main()
{

  /* 构建树结构如下:
            1
          /   \
        2      3
      /  \
    4     5
  */
  struct tNode *root = newtNode(1);
  root->left        = newtNode(2);
  root->right       = newtNode(3);
  root->left->left  = newtNode(4);
  root->left->right = newtNode(5); 

  MorrisTraversal(root);
   return 0;
}

不使用递归和栈遍历二叉树

二叉树遍历一共三种方式(暂且不把层次遍历算在内),前序,中序和后序,而每种遍历又分为递归和非递归版本。不管是递归还是非递归,都用到了栈。为什么要用栈?那是因为其他的方式没法记录当前节点的parent,...
  • LaoJiu_
  • LaoJiu_
  • 2016年03月07日 16:09
  • 1405

二叉树的先序、中序、后序遍历的递归和非递归实现

#include "stdafx.h" #include using namespace std; const int MAXSIZE = 20; //定义栈空间大小为20 stru...
  • htyurencaotang
  • htyurencaotang
  • 2013年10月07日 13:17
  • 4194

非递归,不用栈实现二叉树中序遍历

最近总有人问这个问题:“如何不用栈,也不用递归来实现二叉树的中序遍历”。这个问题的实现就是迭代器问题,无论是Java还是C++,利用迭代器遍历树节点(Java中是TreeMap类,C++中是map类)...
  • mousebaby808
  • mousebaby808
  • 2013年12月01日 18:03
  • 5380

不用栈,来实现二叉树的非递归中序遍历

如果要求只能用非递归方法,同时还不让用栈,来遍历完全二叉树,则每个结点必须有一个指向父结点的指针。 题目: 完全二叉树,采用三叉链表结构。 要求 不用递归,中序遍历这棵树。要求空间复杂度...
  • friendbkf
  • friendbkf
  • 2015年12月02日 16:04
  • 1158

数据结构-----中序遍历二叉树非递归算法(利用堆栈实现)

一、非递归中序遍历算法思想
  • u011459278
  • u011459278
  • 2014年04月19日 18:03
  • 3186

利用栈中序遍历二叉树

//线序建立二叉树,然后利用栈中序遍历    #include"stdlib.h" #include"stdio.h" #include"iostream.h" //********...
  • ss19890125
  • ss19890125
  • 2015年06月02日 18:10
  • 481

使用栈的二叉树前序与中序遍历

使用栈的二叉树前序与中序遍历 使用栈的前序与后序遍历比较简单,只不过改变输出位置。但是原理是要清楚的。 template struct BiNode { T data; BiNode* lch...
  • qq_27802405
  • qq_27802405
  • 2016年03月15日 10:29
  • 2045

二叉树采用三叉链表的存储结构,不借助栈的非递归中序遍历

/********** 【题目】二叉树采用三叉链表的存储结构,试编写 不借助栈的非递归中序遍历算法。 三叉链表类型定义: typedef struct TriTNode { TElemType d...
  • qq1094417747
  • qq1094417747
  • 2016年10月16日 18:05
  • 1006

二叉树的非递归遍历(不用栈、O(1)空间)

本文主要解决一个问题,如何实现二叉树的前中后序遍历,有两个要求: O(1)空间复杂度,即只能使用常数空间; 二叉树的形状不能被破坏(中间过程允许改变其形状)。 通常,实现二叉树的前序(preorder...
  • cyuyanenen
  • cyuyanenen
  • 2016年06月09日 14:23
  • 2642

树的学习——(递归构建二叉树、递归非递归前序中序后序遍历二叉树、根据前序序列、中序序列构建二叉树)

前言 最近两个星期一直都在断断续续的学习二叉树的数据结构,昨晚突然有点融汇贯通的感觉,这里记录一下吧 题目要求 给定前序序列,abc##de#g##f###,构建二叉树,并且用递归和非递归两种方法...
  • zinss26914
  • zinss26914
  • 2012年12月29日 10:46
  • 7655
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不使用递归和栈实现二叉树的中序遍历
举报原因:
原因补充:

(最多只允许输入30个字)