二叉树基础操作

#include<bits/stdc++.h>
#define de(x) cout<<#x<<"="<<x<<endl;
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define repd(i,a,b) for(int i=a;i>=(b);--i)
#define ll long long
#define mt(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define pdd pair<double,double>
#define pdi pair<double,int>
#define mp(u,v) make_pair(u,v)
#define sz(a) a.size()
#define ull unsigned long long
#define ll long long
#define pb push_back
#define PI acos(-1.0)
const int mod = 1e9+7;
const int maxn = 1e3+5;
const double EPS = 1e-6;
using namespace std;
struct node{
    int v,sum;    
}tree[2*2*maxn];
int a[maxn];
int n;
void buildtree(int k){
    if(k>n) return;
    tree[k].v=a[k];
    buildtree(k<<1);
    buildtree((k<<1)+1);
    tree[k].sum=tree[(k<<1)].v+tree[(k<<1)+1].v;
}
void xianxu1(int k){//先序输出(递归)
    if(tree[k].v==0) return;
    printf("%d ",tree[k].v);
    xianxu1(k<<1);
    xianxu1((k<<1)+1);
}
void xianxu2(){//先序输出(非递归)
    stack<int> st;
    st.push(1);
    int k=1;
    while(st.size()){
        while(tree[k].v!=0){
            printf("%d ",tree[k].v);
            if(tree[2*k].v!=0||tree[2*k+1].v!=0) st.push(k);
            k=2*k;
        }
        k=st.top();
        k=2*k+1;
        st.pop();
//        if(tree[2*k+!].v!=0) printf("%d ",tree[2*k+1].v);
    }
}
void zhongxu1(int k){//中序输出(递归)
    if(tree[k].v==0) return;
    zhongxu1(k<<1);
    printf("%d ",tree[k].v);
    zhongxu1((k<<1)+1);
}
void zhongxu2(){//中序输出(非递归)
    stack<int> st;
    st.push(1);
    int k=1;
    while(st.size()||tree[k].v!=0){
        while(tree[k].v!=0){
            //printf("%d ",tree[k].v);
//            if(tree[2*k].v!=0||tree[2*k+1].v!=0) {
//                de(k);
//                st.push(k);
//            }
            if(k!=1) st.push(k);
            k=2*k;
        }
        k=st.top();
        //de(k);
        printf("%d ",tree[k].v);
        k=2*k+1;
        st.pop();
//        if(tree[2*k+!].v!=0) printf("%d ",tree[2*k+1].v);
    }
}
void houxu1(int k){//后序输出(递归)
    if(tree[k].v==0) return;
    houxu1(k<<1);
    houxu1((k<<1)+1);
    printf("%d ",tree[k].v);
}
int main()
{
    mt(tree,0);
    scanf("%d",&n);
    rep(i,1,n+1) scanf("%d",a+i);
    buildtree(1);
//    rep(i,1,n+1) printf("%d ",tree[i].v);
//    xianxu1(1);
//    cout<<endl;
//    xianxu2();
//    zhongxu1(1);
//    cout<<endl;
//    zhongxu2();
    houxu1(1);
    return 0;
}
/*
    本篇代码记录的是二叉树的数组建树,和先序输出(递归和非递归),中序输出(递归和非递归),还有后序输出(递归)
*/

 

posted on 2017-10-01 19:43  chinacwj1  阅读(161)  评论(0编辑  收藏  举报

导航