二叉树的Morris遍历

  二叉树的遍历,除了上篇文章中的传统递归和使用的栈结构的非递归方式,还有如下这种Morris遍历方式,该算法的构思非常巧妙:利用前驱空闲的rightChild指针指向当前节点,形成一个环。时间复杂度和前面两种一样,还是O(n),但是空间复杂度由O(n)直接下降到了O(1)。代码如下:

  1 /*************************************************************************
  2     > File Name: MorrisTraversal.c
  3     > Description: 线索二叉树的实现
  4     > Author: Yves
  5     > E-mail: 
  6     > Created Time: 2015-5-23. 22:51:16
  7  ************************************************************************/
  8 
  9 #include <stdio.h>
 10 #include <stdlib.h>
 11 
 12 typedef char ElemType;
 13 typedef struct tagBiTreeNode
 14 {
 15     ElemType data;
 16     struct tagBiTreeNode* leftChild;
 17     struct tagBiTreeNode* rightChild;
 18 }BiTreeNode, *pBiTreeNode;//指向BiTNode的指针
 19 
 20 static void CreatBiTree(pBiTreeNode *root);//创建二叉树
 21 static void PreOrderMorrisTraversal(pBiTreeNode root);//前序Morris遍历
 22 static void InOrderMorrisTraversal(pBiTreeNode root);//中序Morris遍历
 23 static void PostOrderMorrisTraversal(pBiTreeNode root);//后序Morris遍历
 24 
 25 pBiTNode pre;
 26 
 27 int main(void)
 28 {
 29     pBiTreeNode root;
 30     printf("Please input the node of the tree(preorder sequence): ");
 31     CreatBiTree(&root);
 32     printf("Traverse the tree in PreOrderMorrisTraversal\n");
 33     PreOrderMorrisTraversal(root);
 34     printf("Traverse the tree in InOrderMorrisTraversal\n");
 35     InOrderMorrisTraversal(root);
 36     printf("Traverse the tree in PostOrderMorrisTraversal\n");
 37     PostOrderMorrisTraversal(root)
 38     
 39     return 0;
 40 }
 41 
 42 static void CreatBiTree(pBiTreeNode *root)
 43 {
 44     ElemType c;
 45     scanf("%c",&c);
 46     if(c == '#')
 47     {
 48         *root = NULL;
 49     }else
 50     {
 51         *root = (pBiTreeNode)malloc(sizeof(BiTreeNode));
 52         (*root)->data = c;
 53         CreatBiTree(&(*root)->leftChild);
 54         CreatBiTree(&(*root)->rightChild);
 55     }
 56 }
 57 
 58 static void PreOrderMorrisTraversal(pBiTreeNode root)
 59 {
 60     if(root == NULL)
 61     {
 62         return;
 63     }
 64     pBiTreeNode cur,pre,temp;
 65     cur = root;
 66     while(cur != NULL)
 67     {
 68         if(!cur->leftChild)
 69         {
 70             printf("%c ", cur->data);
 71             pre = cur;
 72             cur = cur->rightChild;
 73         }else
 74         {
 75             for(temp = cur->leftChild; temp->rightChild != NULL && temp->rightChild != cur; temp = temp->rightChild);
 76             if(temp->rightChild == NULL)
 77             {
 78                 temp->rightChild = cur;
 79                 printf("%c ", cur->data);
 80                 pre = cur;
 81                 cur = cur->leftChild;
 82             }else
 83             {
 84             
 85                 temp->rightChild = NULL;
 86                 cur = cur->rightChild;
 87             }
 88         }
 89     }
 90 }
 91 
 92 
 93 static void InOrderMorrisTraversal(pBiTreeNode root)
 94 {
 95     if(root == NULL)
 96     {
 97         return;
 98     }
 99     pBiTreeNode cur,pre,temp;
100     cur = root;
101     while(cur != NULL)
102     {
103         if(!cur->leftChild)
104         {
105             printf("%c ", cur->data);
106             pre = cur;
107             cur = cur->rightChild;
108         }else
109         {
110             for(temp = cur->leftChild; temp->rightChild != NULL && temp->rightChild != cur; temp = temp->rightChild);
111             if(temp->rightChild == NULL)
112             {
113                 temp->rightChild = cur;
114                 cur = cur->leftChild;
115             }else /*Meaning the left tree has been accessed completely.*/
116             {
117                 printf("%c ", cur->data);
118                 temp->rightChild = NULL;
119                 pre = cur;
120                 cur = cur->rightChild;
121             }
122         }
123     }
124 }
125 
126 static void PostOrderMorrisTraversal(pBiTreeNode root)
127 {
128     //coding
129 }

 

posted @ 2015-05-23 23:34  唐公子  阅读(523)  评论(0编辑  收藏  举报