题目链接:https://acm.sdut.edu.cn/onlinejudge3/contests/3982/problems/B
模板借鉴:https://www.cnblogs.com/cynchanpin/p/6758429.html
代码的实现是以先序遍历为主,利用先序遍历和中序遍历中元素的位置来控制左右孩子
递归部分想要跟踪起来挺麻烦的,我跟踪了一遍但是感觉靠跟踪记住公式不大行。
其实数的ls和rs部分就是利用中序来区别左子树和右子树,从一颗大树按照规则一步步往下分
例如 ABDCEF BDAECF
左子树就是从front+1开始的 index个长度
右子树就是从front+1+index开始的剩下长度 也就是len-index-1
这样就通了,剩下的交给递归,一层一层的让电脑去划分
AC代码:
#include<bits/stdc++.h> using namespace std; struct treet{ char data; treet *ls; treet *rs; }; int find(char ch,char *center,int len) { for(int i=0;i<len;i++) if(center[i]==ch) return i; return -1; } treet *create(char *front,char *center,int len) { if(len<=0) return NULL; treet *tr = new treet; tr->data = *front; cout<<tr->data<<' '; int index = find(*front,center,len); tr->ls = create(front+1,center,index); tr->rs = create(front+index+1,center+index+1,len-index-1); return tr; } void houxu(treet *tr) { if(tr==NULL) return; else { houxu(tr->ls); houxu(tr->rs); cout<<tr->data; } } int main() { char *front = new char [100]; char *center = new char [100]; cin>>front; cin>>center; treet *tr = create(front,center,strlen(front)); houxu(tr); }