之前还写过一篇
正题
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度 ≤8)。
输入格式
2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
1行,表示一棵二叉树的先序。
输入输出样例
输入 #1
BADC
BDCA
输出 #1
ABCD
题目分析
1.后续的最后一个永远是根节点,是谁的根要你自己判断
2.每一棵子树的中序和后序长度必定相等
3.当序列长度为1时,便是根
下面我会在用到以上要点的地方标注
核心代码
void InsertTree(NODE &root,string in_str,string post_str) {
root = createNode(post_str[post_str.length() - 1]);//1
int root_index = in_str.find(root->data);
string lin_str = in_str.substr(0, root_index);
string rin_str = in_str.substr(root_index + 1);
string lpost_str = post_str.substr(0, lin_str.length());//2
string rpost_str = post_str.substr(lin_str.length(),rin_str.length()); //2
if (lin_str.length() == 1) root->lnode = createNode(lin_str[0]);//3
else if (lin_str.length()) InsertTree(root->lnode, lin_str, lpost_str);
if (rin_str.length() == 1) root->rnode = createNode(rin_str[0]);//3
else if (rin_str.length())InsertTree(root->rnode, rin_str, rpost_str);
}
全部代码
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
typedef struct Node{
char data;
Node* lnode;
Node* rnode;
}Node,*NODE;
NODE createNode(char data) {
NODE node = (NODE)malloc(sizeof(Node));
node->data = data;
node->lnode = node->rnode = NULL;
return node;
}
void InsertTree(NODE &root,string in_str,string post_str) {
root = createNode(post_str[post_str.length() - 1]);
int root_index = in_str.find(root->data);
string lin_str = in_str.substr(0, root_index);
string rin_str = in_str.substr(root_index + 1);
string lpost_str = post_str.substr(0, lin_str.length());
string rpost_str = post_str.substr(lin_str.length(),rin_str.length());
if (lin_str.length() == 1) root->lnode = createNode(lin_str[0]);
else if (lin_str.length()) InsertTree(root->lnode, lin_str, lpost_str);
if (rin_str.length() == 1) root->rnode = createNode(rin_str[0]);
else if (rin_str.length())InsertTree(root->rnode, rin_str, rpost_str);
}
void PreOrder(NODE root) {
if (root) {
cout << root->data;
PreOrder(root->lnode);
PreOrder(root->rnode);
}
}
int main() {
NODE root;
string in_str;
string post_str;
cin >> in_str >> post_str;
InsertTree(root, in_str, post_str);
PreOrder(root);
cout << endl;
return 0;
}