码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树基础操作

时间:2017-10-01 20:33:11      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:nod   div   double   ==   logs   mes   include   class   size   

#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;
}
/*
    本篇代码记录的是二叉树的数组建树,和先序输出(递归和非递归),中序输出(递归和非递归),还有后序输出(递归)
*/

 

二叉树基础操作

标签:nod   div   double   ==   logs   mes   include   class   size   

原文地址:http://www.cnblogs.com/chinacwj/p/7617670.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!