Inorder Tree Traversal without recursion and without stack!

来源:互联网 发布:用友软件科目编码 编辑:程序博客网 时间:2024/06/06 01:50
#include<stdio.h>#include<stdlib.h> /* A binary tree tNode has data, pointer to left child   and a pointer to right child */struct tNode{   int data;   struct tNode* left;   struct tNode* right;}; /* Function to traverse binary tree without recursion and    without stack */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    {      /* Find the inorder predecessor of current */      pre = current->left;      while(pre->right != NULL && pre->right != current)        pre = pre->right;       /* Make current as right child of its inorder predecessor */      if(pre->right == NULL)      {        pre->right = current;        current = current->left;      }                   /* Revert the changes made in if part to restore the original         tree i.e., fix the right child of predecssor */         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 */} /* UTILITY FUNCTIONS *//* Helper function that allocates a new tNode with the   given data and NULL left and right pointers. */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);} /* Driver program to test above functions*/int main(){   /* Constructed binary tree is            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);   getchar();  return 0;}