(1)九度上一个关于二叉树遍历的问题。通过给定的前序遍历与中序遍历就可以确定二叉树的结构。
二叉树的前序、中序、后序遍历的定义:
前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;
中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。
两个字符串,其长度n均小于等于26。
第一行为前序遍历,第二行为中序遍历。
二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。
输入样例可能有多组,对于每组测试样例,
输出一行,为后序遍历的字符串。
实现代码如下:
#include <stdio.h> #include <string.h> struct node{ char id; node* left; node* right; }; node* get_root(char* pre, char* mid) { node* n = new node; n->id = pre[0]; n->left = NULL; n->right = NULL; char head = pre[0]; int mid_len = strlen(mid); int pre_len = strlen(pre); if(pre_len == 1) return n; if(mid_len == 1) return n ; int i=0; char left_tree_pre[27]; char right_tree_pre[27]; memset(left_tree_pre, 0, 27); memset(right_tree_pre, 0, 27); char left_tree_mid[27]; char right_tree_mid[27]; memset(left_tree_mid, 0, 27); memset(right_tree_mid, 0, 27); //找到中序遍历中根节点所在的位置 for(i=0; i<mid_len; ++i) if(head == mid[i]) break; //其左子树不为空 if(i > 0) { memcpy(left_tree_pre, pre+1, i); memcpy(left_tree_mid, mid, i); //采用递归依次处理子树 n->left = get_root(left_tree_pre, left_tree_mid); } //其右子树不为空 if(i < (mid_len-1)) { memcpy(right_tree_pre, pre+i+1, pre_len-i-1); memcpy(right_tree_mid, mid+i+1, mid_len-i-1); //采用递归依次处理子树 n->right = get_root(right_tree_pre,right_tree_mid); } return n; } void last(node *n) { if(n->left != NULL) last(n->left); if(n->right != NULL) last(n->right); printf("%c", n->id); } void clear(node *n) { if(n->left!=NULL) clear(n->left); if(n->right != NULL) clear(n->right); delete n; n = NULL; } int main() { char p[27]; char s[27]; memset(p, 0, 27); memset(s, 0, 27); while(scanf("%s\n%s", p, s) == 2) { node* n = get_root(p,s); last(n); printf("\n"); //清空操作 memset(p, 0, 27); memset(s, 0, 27); clear(n); } return 0; }