实验3:由遍历序列构造二叉树
二叉树构造定理:
- 定理7.1:任何n(n>0)个不同结点的二又树,都可由它的中序序列和先序序列唯一地确定。
- 定理7.2:任何n(n>0)个不同结点的二又树,都可由它的中序序列和后序序列唯一地确定。
题目: 已知先序序列为ABDGCEF,中序序列为DGBAECF,则构造二叉树的过程如下所示。
C语言代码示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<malloc.h> 3 4 typedef struct node 5 { 6 struct node *lchild, *rchild; 7 char data; 8 } BTNode; 9 10 BTNode* CreateBTree(char *pre, char *in, int n) 11 { 12 int k; 13 char *p; 14 if (n <= 0) 15 return NULL; 16 BTNode *b = (BTNode*)malloc(sizeof(BTNode)); 17 b->data = *pre; 18 for (p = in; p < in + n; ++p) 19 if (*p == *pre) 20 break; 21 k = p-in; 22 b->lchild = CreateBTree(pre+1, in, k); 23 b->rchild = CreateBTree(pre+k+1, p+1, n-k-1); 24 return b; 25 } 26 27 void dispBTree(BTNode *b) 28 { 29 if(b!= NULL) 30 { 31 printf("%c", b->data); 32 if(b->lchild != NULL || b->rchild != NULL) 33 { 34 printf("("); 35 dispBTree(b->lchild); 36 if(b->rchild != NULL) 37 printf(","); 38 dispBTree(b->rchild); 39 printf(")"); 40 } 41 } 42 } 43 44 int main() 45 { 46 BTNode* b; 47 char pre[] = "ABDGCEF"; 48 char in[] = "DGBAECF"; 49 int n = 7; 50 b = CreateBTree(pre, in, 7); 51 dispBTree(b); 52 return 0; 53 }
运行结果:
C++代码示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 13 { 14 TreeNode *b = CreateBTree(preorder.begin(), inorder.begin(), inorder.size()); 15 return b; 16 } 17 18 TreeNode* CreateBTree(vector<int>::iterator p, vector<int>::iterator q, int n) 19 { 20 TreeNode *b; 21 auto s = q; 22 int k; 23 if(n <= 0) 24 return nullptr; 25 b = new TreeNode(*p); 26 for(; s < q + n; ++s) 27 if(*s == *p) 28 break; 29 k = s - q; 30 b->left = CreateBTree(p+1, q, k); 31 b->right = CreateBTree(p+k+1, s+1, n-k-1); 32 return b; 33 } 34 };