数据结构(一)

前序中序求二叉树

a数组存中序遍历,b数组存先序遍历

根据先序遍历节点在中序遍历中的位置,划分其左右子树。

void build(int n,int *a,int *b,tree *&node){
    for(int i=1;i<=n;++i){
        if(a[i]==b[1]){
            node = new tree;
            node->data=b[1];
            node->ld=NULL;
            node->rd=NULL;
            build(i-1,a,b+1,node->ld);
            build(n-i,a+i,b+i,node->rd);
            break;
        }
    }
}

堆的建立

每插入一个节点,判断其与父节点的大小关系并调整

void build(int i){
    if(i==1)
        return;
    while(i!=1){
        if(h[i]<h[i/2]){
          swap(h[i],h[i/2]);
            i/=2;  
        }
        else
            break;
    }
}
for(int i=1;i<=n;++i){
        cin>>h[i];
        build(i);
}