描述: | 二叉树的前序、中序、后序遍历的定义: |
题目类别: | 树 |
难度: | 中级 |
运行时间限制: | 无限制 |
内存限制: | 无限制 |
输入: | 两个字符串,其长度n均小于等于26。 |
输出: | 输入样例可能有多组,对于每组测试样例, |
样例输入: | ABC BAC FDXEAG XDEFAG |
样例输出: | BCA XEDGAF |
代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
struct node //定义树结构
{
char id;
node* left;
node* right;
};
node* get_root(char* pre, char* mid)//取根节点
{
node* nd = new node;
nd->id = pre[0];//前序遍历的第一个节点
nd->left = NULL;
nd->right = NULL;
char head = pre[0];//头结点为前序遍历的第一个节点,保存下来
int mid_len = strlen(mid);
int pre_len = strlen(pre);
if(pre_len == 1)//如果只有一个节点,直接返回
return nd;
if(mid_len == 1)
return nd ;
int i=0;
char left_tree_pre[27];//最多26个节点,定义27
char right_tree_pre[27];
memset(left_tree_pre, 0, 27);//全部初始化为0
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);//头节点以前的为新的 left_tree_pre,即为左子树
memcpy(left_tree_mid, mid, i);//从中序遍历中拷贝i个到新的中序遍历中去
nd->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);
nd->right = get_root(right_tree_pre,right_tree_mid); //递归依次处理子树
}
return nd;
}
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);
}
system("pause");
return 0;
}
参考地址: 1 2