二叉树
建树
非指针法:
const int N=1010;
const int root=1;
char s[N];
int lef[N],rig[N],val[N];
bool fail,have_val[N];
int cnt;
inline void newtree() {
lef[root]=rig[root]=0;
have_val[root]=false;
cnt=root;
}
inline int newnode() {
int u=++cnt;
lef[u]=rig[u]=0;
have_val[u]=false;
return u;
}
inline void addnode(int v,char* s){
int n=strlen(s);
int u=root;
for(int i=0;i<n;i++){
if(s[i]=='L') {
if(lef[u]==0) lef[u]=newnode();
u=lef[u];
}
else if(s[i]=='R') {
if(rig[u]==0) rig[u]=newnode();
u=rig[u];
}
}
if(have_val[u]) fail=true;
val[u]=v;
have_val[u]=true;
}
//广度优先遍历
inline bool bfs(vector<int> &ans){
queue<int> q;
ans.clear();
q.push(root);
while(!q.empty()) {
int u=q.front();q.pop();
if(have_val[u]==0) return false;
ans.push_back(val[u]);
if(lef[u]!=0) q.push(lef[u]);
if(rig[u]!=0) q.push(rig[u]);
}
return true;
}
从遍历序重建树
【题目】
假设一棵二叉树的后序遍历序列为 DGJHEBIFCA ,中序遍历序列为 DBGEHJACIF ,则其前序
遍历序列为_____.
【方法】后序遍历最后一个是根节点。找到后序遍历最后一个数组,然后在前序中找到其位置。然后去除后序中那个,继续找根。
【图示】
【第一步】
由后序遍历的最后一个节点可知本树根节点为【A】
加上中序遍历的结果,得知以【A】为根节点时,中序遍历结果被【A】分为两部分【DBGEHJ】【A】【CIF】
于是作出第一幅图如下:
————– ——A
————– —– 八
—DBGEHJ】 and 【 CIF
【第二步】
将已经确定了的节点从后序遍历结果中分割出去 即【DGJHEBIFC】—【A】
此时,位于后序遍历结果中的最后一个值为【C】 说明节点【C】是某棵子树的根节点。。。以此类推。
CODE
int build(int L1,int R1,int L2,int R2)
{
if(L1 > R2)return 0;
int root = post_order[R2],p = R1;
while(in_order[p] != root)p++;
int cnt = p - L1;
L[root] = build(L1,p-1,L2;L2+cnt-1);
R[root] = build(p+1,R1,L2+cnt,R2-1);
return root;
}