二叉树的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 }
作者:webshell
出处:http://www.cnblogs.com/yves
本文版权归作者和博客园所有,欢迎转载,转载请标明出处。