1 /*主函数:重建二叉树*/ 2 bool treeBuild(int *arrayBefore, int *arrayMiddle, int length, TreeNode * treeRoot) 3 { 4 int key; 5 int leftLenth = 0; 6 int rightLenth = 0; 7 bool result; 8 9 /*1.合法性检查*/ 10 if((NULL == arrayBefore)&&(NULL == arrayMiddle)) 11 { 12 return false; 13 } 14 if((NULL == treeRoot)||(length <= 0)) 15 { 16 return false; 17 } 18 19 /*2.找到分段点*/ 20 key = arrayBefore[0]; 21 while(leftLenth < length) 22 { 23 if(key == arrayMiddle[leftLenth]) 24 { 25 break; 26 } 27 else 28 { 29 leftLenth++; 30 } 31 } 32 33 /*3.重建左子节点*/ 34 if(leftLenth != 0) 35 { 36 treeRoot->left = (TreeNode *)malloc(sizeof(TreeNode)); 37 treeRoot->left->left = NULL; 38 treeRoot->left->right = NULL; 39 result = treeBuild(arrayBefore+1, arrayMiddle, leftLenth, treeRoot->left); 40 if(false == result) 41 { 42 freeTreeNode(treeRoot->left); 43 return false; 44 } 45 } 46 47 /*4.重建右子节点*/ 48 rightLenth = length - 1 - leftLenth; 49 if(rightLenth != 0) 50 { 51 treeRoot->right = (TreeNode *)malloc(sizeof(TreeNode)); 52 treeRoot->right->left = NULL; 53 treeRoot->right->right = NULL; 54 result = treeBuild(arrayBefore + 1 + leftLenth, arrayMiddle + 1 + leftLenth, rightLenth, treeRoot->right); 55 if(false == result) 56 { 57 freeTreeNode(treeRoot->left); 58 freeTreeNode(treeRoot->right); 59 return false; 60 } 61 } 62 63 treeRoot->value = key; 64 return true; 65 } 66 67 /*辅助函数:后序打印*/ 68 void printTreeNode(TreeNode * treeRoot) 69 { 70 if(NULL == treeRoot) 71 { 72 return; 73 } 74 75 printTreeNode(treeRoot->left); 76 printTreeNode(treeRoot->right); 77 printf("%d ", treeRoot->value); 78 return; 79 } 80 81 /*辅助函数:释放所有节点*/ 82 void freeTreeNode(TreeNode * treeRoot) 83 { 84 if(NULL == treeRoot) 85 { 86 return; 87 } 88 89 if(NULL != treeRoot->left) 90 { 91 freeTreeNode(treeRoot->left); 92 treeRoot->left = NULL; 93 } 94 95 if(NULL != treeRoot->right) 96 { 97 freeTreeNode(treeRoot->right); 98 treeRoot->right = NULL; 99 } 100 101 free(treeRoot); 102 treeRoot = NULL; 103 104 return; 105 }