通过这些组合可以建立起一棵二叉树
这里关注前序遍历和中序遍历中,左子树和右子树的切分点
#include <cstdio>
#include <iostream>
#include <string>
#include <queue>
using namespace std;
void visit(char c){
cout<<c;
return ;
}
struct TreeNode{
char data;
TreeNode* leftchild;
TreeNode* rightchild;
TreeNode(char c):data(c),leftchild(NULL),rightchild(NULL){} //构造函数 nullptr;
};
void PreOrder(TreeNode* root){
if(root == NULL){
return;
}
visit(root->data);
PreOrder(root->leftchild);
PreOrder(root->rightchild);
return;
}
void InOrder(TreeNode* root){
if(root == NULL){
return;
}
InOrder(root->leftchild);
visit(root->data);
InOrder(root->rightchild);
return;
}
void PostOrder(TreeNode* root){
if(root == NULL){
return;
}
PostOrder(root->leftchild);
PostOrder(root->rightchild);
cout<<root->data;
return;
}
void LevelOrder(TreeNode* root){ //层次遍历。利用队列。
queue<TreeNode*>myQueue;
if(root != NULL){
myQueue.push(root);
}
while(!myQueue.empty()){
TreeNode* current =myQueue.front();
myQueue.pop();
visit(current->data);
if(current->leftchild!= NULL){
myQueue.push(current->leftchild);
}
if(current->rightchild != NULL){
myQueue.push(current->rightchild);
}
}
return;
}
TreeNode* Build(string s1,string s2){ //根据前序遍历和中序遍历建立一棵二叉树
if(s1.size() == 0){
return NULL;
}
char c = s1[0];
TreeNode* root = new TreeNode(c); //创建新节点
int position = s2.find(c); //切分点P
root->leftchild = Build(s1.substr(1,position),s2.substr(0,position)); //sub(起始位置,长度)
root->rightchild = Build(s1.substr(position + 1),s2.substr(position+1));
return root;
}
int main(void){ //通过前序遍历和中序遍历构件二叉树并输出其后续遍历
string str1,str2;
while(cin>>str1>>str2){
TreeNode* root = Build(str1,str2);
PostOrder(root);
cout<<endl;
}
return 0;
}