知道二叉树的前序和中序序列重建这颗二叉树,从最简单的开始,我们假设这两个序列的确是一颗二叉树的前序和中序序列并且这可二叉树中没有重复的节点:
1 #include <stdio.h> 2 #include <malloc.h> 3 4 struct NODE 5 { 6 int data; 7 8 struct NODE *lChild; 9 struct NODE *rChild; 10 }; 11 12 // 重建二叉树,要求此二叉树中不能有重复的节点 13 void RebuildBinaryTree(int *PreOrder, int n, int *InOrder, int m, struct NODE **root) 14 { 15 if ((NULL == PreOrder) || (n <= 0) || (NULL == InOrder) || (m <= 0) || (NULL == root)) 16 { 17 printf ("Invalid Parameter(s)!\n"); 18 return; 19 } 20 21 // 前序中序长度一定是一样 22 if (n != m) 23 { 24 printf ("Error! The length of PreOrder and InOrder are different!\n"); 25 return; 26 } 27 28 if (n > 0) 29 { 30 int i = 0; 31 32 for (i = 0; i < m; ++i) 33 { 34 // 如果二叉树有重复的节点,则这这一步就有可能判断错误 35 if (PreOrder[0] == InOrder[i]) 36 { 37 break; 38 } 39 } 40 41 if (NULL == (*root = (struct NODE *)malloc(sizeof(struct NODE)))) 42 { 43 printf ("Fail to malloc space for *root!\n"); 44 return; 45 } 46 47 (*root)->data = PreOrder[0]; 48 49 if (i > 0) 50 { 51 // 重建当前节点的左子树 52 RebuildBinaryTree (PreOrder + 1, i, InOrder, i, &((*root)->lChild)); 53 } 54 else 55 { 56 (*root)->lChild = NULL; 57 } 58 59 if (i < (m - 1)) 60 { 61 // 重建当前节点的右子树 62 RebuildBinaryTree (PreOrder + i + 1, n - 1 - i, InOrder + i + 1, m - 1 - i, &((*root)->rChild)); 63 } 64 else 65 { 66 (*root)->rChild = NULL; 67 } 68 } 69 } 70 71 // 递归前序遍历 72 void RecursionPreOrder(struct NODE *root) 73 { 74 if (NULL != root) 75 { 76 // 访问当前节点 77 printf ("%d ", root->data); 78 79 // 访问左子树 80 RecursionPreOrder (root->lChild); 81 82 // 访问右子树 83 RecursionPreOrder (root->rChild); 84 } 85 } 86 87 int main(void) 88 { 89 int PreOrder[] = {1, 2, 4, 5, 3, 6, 7}; 90 int InOrder[] = {4, 2, 5, 1, 6, 3, 7}; 91 struct NODE *root = NULL; 92 // 重建二叉树 93 RebuildBinaryTree (PreOrder, 7, InOrder, 7, &root); 94 95 printf ("重建的二叉树的前序遍历序列为:\n"); 96 RecursionPreOrder (root); 97 printf ("\n"); 98 99 return(0); 100 }