【 数据结构基础 】

二叉树

建树

非指针法:

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;
}

猜你喜欢

转载自blog.csdn.net/k42946/article/details/81562760