//根据先序遍历和中序遍历 重构二叉树
#include <cstdio>
#include <string>
using namespace std;
struct TreeNode{
char data;
TreeNode * leftChild;
TreeNode * rightChild;
};
TreeNode * rebuild(string preOrder,string inOrder){
//rebuild 的返回值表示子树的根节点的地址
if(preOrder.size() == 0){
return NULL;
}
else{
char rootdata = preOrder[0];
TreeNode *pNewNode = new TreeNode;
pNewNode->data = rootdata; //子树的根建好了
//拿根去切割中序
int pos = inOrder.find(rootdata);//pos是根在中序序列中出现的下标
// preOrder.substr(1,pos);//将preorder切割,取出从下标1开始长度为pos的子串 //先序的
// preOrder.substr(pos+1);//将preorder切割,取出从下标pos+1开始,到结束位置的子串
// inOrder.substr(0,pos); //中序的
// inOrder.substr(pos+1);
/*
* 先序 a bcdgfe
* 中序 b a dfgce
* 确定a是根 ,得到左右子树的结点数 ;把大问题变成小问题
*/
pNewNode->leftChild = rebuild(preOrder.substr(1,pos),inOrder.substr(0,pos));
pNewNode->rightChild = rebuild(preOrder.substr(pos+1),inOrder.substr(pos+1));
return pNewNode;
}
}
void postOrder(TreeNode *root){
if(root == NULL){
return;
}
postOrder(root->leftChild);
postOrder(root->rightChild);
printf("%c",root->data);
}
int main(){
char preOrder[30];
char inOrder[30]; //申请两个数组
while (scanf("%s%s",preOrder,inOrder) != EOF){
TreeNode * root = rebuild(preOrder,inOrder); //申请一个根结点
postOrder(root);
printf("\n");
}
}
根据先序遍历和中序遍历 重构二叉树 ,进行后序遍历 输出
于 2024-03-21 09:25:20 首次发布