结点结构
typedef struct Node{
char data;
struct Node *left;
struct Node *right;
}Node;
已知前序和后序遍历,建立二叉树(不唯一,一种可能的结果即可)
问题的关键在于如何把前序和后序划分出左右子树。其实只要划分出左子树就行(剩下的就是根结点和右子树):
- 前序提供左子树根节点
pre[pre_start+1]
- 在后序中找到左子树根节点的位置
post_left_root_pos
,即可获得左子树的长度。
int find(char str[], char x, int start, int end){
for(int k = start; k < end; k++){
if(str[k] == x)
return k;
}
return -1;
}
Node* CreateFrom3(char pre[], char post[], int pre_start, int pre_end, int post_start, int post_end){
if(pre_start >= pre_end || post_start >= post_end)
return NULL;
else if(pre_start + 1 == pre_end && post_start + 1 == post_end && pre[pre_start] == post[post_start]){
Node* p = (Node*)malloc(sizeof(Node));
p->data = pre[pre_start];
p->left = NULL;
p->right = NULL;
return p;
}
else{
char root_data = pre[pre_start];
char left_root_data = pre[pre_start + 1];
int post_left_root_pos = find(post, left_root_data, post_start, post_end);
int left_len = post_left_root_pos - post_start + 1;
int right_len = post_end - left_len - 1;
Node* root = (Node*)malloc(sizeof(Node));
Node* left = CreateFrom3(pre, post, pre_start + 1, pre_start + left_len + 1, post_start, post_left_root_pos + 1);
Node* right= CreateFrom3(pre, post, pre_start + left_len + 1, pre_end, post_left_root_pos + 1, post_end - 1);
root->data = root_data;
root->left = left;
root->right = right;
return root;
}
}