0 结果
1 题目
2 思路
因为要转换为中序表达式,因此使用中序遍历。在中序遍历的过程中,对于当前访问的非空结点p,则先输出"(“,然后递归调用左子树,输出p的权值,递归调用右子树,输出“)”,如果p是根或者叶结点,则不需要输出“(”或”)"。
#include <vector>
using std::vector;
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode;
void inOrder(BiTNode* p){
if(p == nullptr) return;
if(p->lchild != nullptr || p->rchild != nullptr)
printf("(");
inOrder(p->lchild);
printf("%c", p->data);
inOrder(p->rchild);
if(p->lchild != nullptr || p->rchild != nullptr)
printf(")");
}
void ans(BiTNode* T){
inOrder(T->lchild);
printf("%c ", T->data);//单独处理根结点
inOrder(T->rchild);
}
//char in[] = {'a', '+', 'b', '*', 'c', '*', '-', 'd'};//中序遍历
//测试序列2
char in[] = {'a', '*', 'b', '+', '-', 'c', '-', 'd'};//中序遍历
//层序、中序创建二叉树
BiTNode* Create4(vector<char> layer, int inL, int inR){
if(layer.size() == 0){//当前层序遍历完
return NULL;
}
BiTNode* root = new BiTNode ;
root->data = layer[0];
int k;
for (k = inL; k <= inR; ++k) {//中序序列中寻找根结点
if(in[k] == root->data){
break;
}
}
vector<char> leftLayer;//左子树层次遍历
vector<char> rightLayer;//右子树层次遍历
for (int i = 1; i < layer.size(); ++i) {//遍历层序序列,分左右子树存储
bool isLeft = false;
for (int j = inL; j < k; ++j) {
if(layer[i] == in[j]){
isLeft = true;
break;
}
}
if(isLeft == true){
leftLayer.push_back(layer[i]);
}else{
rightLayer.push_back(layer[i]);
}
}
root->lchild = Create4(leftLayer,inL, k - 1);
root->rchild = Create4(rightLayer,k + 1, inR);
return root;
}
int main(){
BiTNode* root;
vector<char> layer;//层序遍历
// layer.push_back('*');
// layer.push_back('+');
// layer.push_back('*');
// layer.push_back('a');
// layer.push_back('b');
// layer.push_back('c');
// layer.push_back('-');
// layer.push_back('d');
//测试序列2
layer.push_back('+');
layer.push_back('*');
layer.push_back('-');
layer.push_back('a');
layer.push_back('b');
layer.push_back('-');
layer.push_back('c');
layer.push_back('d');
root = Create4(layer, 0, layer.size() - 1);
ans(root);
return 0;
}