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

原创 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;
}

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

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

利用非递归方法实现二叉树的中序遍历

#include #include #define N 7 using namespace std; typedef struct node { struct node *leftChild; ...
  • stpeace
  • stpeace
  • 2012年11月02日 10:45
  • 1173

.如何不用递归实现二叉树的前序/后序/中序遍历?

import java.lang.Thread.State; import java.util.ArrayDeque; import java.util.ArrayList; import java....

算法导论第十章习题10.4-3非递归方式实现二叉树的中序遍历

非递归方式实现二叉树的中序遍历:迭代方式: //非递归中序遍历 void NonReInOrder(BintreeNode* node) { BintreeNode*p=node; s...

利用非递归方法实现二叉树的中序遍历

#include #include #define N 7 using namespace std; typedef struct node { struct node *leftChild; ...

二叉树非递归中序遍历

  • 2014年06月19日 11:36
  • 2KB
  • 下载

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

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

不用栈实现二叉树非递归中序遍历源代码说明

偶尔看到这样一个问题: 有个二叉树,每个节点除了左右指针外,还有一个指向父节点的指针。要求不用递归,中序遍历这棵树。另要求空间复杂度是O(1). 空间复杂度为O(1),摆明就是不让用堆栈模拟递归,所以...

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

偶尔看到这样一个问题:   有个二叉树,每个节点除了左右指针外,还有一个指向父节点的指针。 要求不用递归,中序遍历这棵树。另要求空间复杂度是O(1).   空间复杂度为O(1),摆明就是不让...

已知前序和中序遍历恢复二叉树(递归)

#include using namespace std; #define TREELEN 6 //数据结构定义 struct NODE { NODE* pLeft; //左子树 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不使用递归和栈实现二叉树的中序遍历
举报原因:
原因补充:

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