树和二叉树

树和二叉树

标签(空格分隔) : 算法 ACM

1.二叉树数组表示

A:

以根节点、左节点、右节点的顺序将各个节点放入数组,数组中下标为index的节点其左节点的下标为2 * index + 1 ,右节点为 2 * index + 2 ,其父节点的下标为 ( index - 1) / 2 。( 在完美二叉树中不会有空节点,完美二叉树即在一棵树中,只有最后一层从右边开始缺失节点。)

B:

也可以用三个数组表示,第i个结点的左右结点下标存在left[i]和right[i]中,以简单实现二叉树的访问、增加、更改。

2.二叉树遍历

遍历二叉树的所有结点且仅访问一次。按照根节点位置的不同分为前序遍历,中序遍历,后序遍历。

前序遍历:根节点->左子树->右子树(根节点在前面)

中序遍历:左子树->根节点->右子树(根节点在中间)

后序遍历:左子树->右子树->根节点(根节点在后边)

2.1三种遍历的递归实现方式(DFS)
typedef struct node{
    int val;
    struct node * left;
    struct node * rigtht;
}

//前序遍历
void tree_visit(Node * root)
{
    if( root == NULL)
        return ;
    visit(root);
    tree_visit(root->left);
    tree_visit(root->right);
}

//中序遍历
void tree_visit(Node * root)
{
    if( root == NULL)
        return ;
    tree_visit(root->left);
    visit(root);
    tree_visit(root->right);
}


//后续遍历
void tree_visit(Node * root)
{
    if( root == NULL)
        return ;
    tree_visit(root->left);
    tree_visit(root->right);
    visit(root);

}

2.2三种遍历栈实现方式
//非递归使用栈实现

//前序遍历
void tree_visit(Node * root)
{
    if(root == NULL)
        return ;
     stack<Node *> s;
    s.push(root);
    Node * p;
    while(!s.empty())
    {
        p = s.top();
        s.pop();
        visit(p);
        if(p->right!=NULL)
            s.push(p->right);//栈是先进后出,所以前序遍历的right要先放入栈中
        if(p->left!=NULL)
            s.push(p->lefy);
    }
}

//中序遍历
void tree_visit(Node * root)
{

    if(root == NULL)
        return ;
    stack<Node * > s;
    Node * p = root;
    //以左结点向下搜索,若结点不存在则出栈父节点进行访问,然后用右结点向下搜索,即中序遍历
    while(!s.empty() || p != NULL)
    {
        if( p == NULL)
        {
            p = s.pop();
            s.pop();
            visit(p);
            p = p->right;
        }
        else
        {
            s.push(p);
            p = p -> left;
        }
    }
}



//后序遍历


void tree_visit(Node * root)
{
    if( root == NULL)
        return ;
    stack<Node *> s;
    vector<Node *> rs;
    Node * p = NULL;
    s.push(root);
    while(!s.empty())
    {
        p = s.top()
        s.pop();
        //从开始把root插入rs,以left和right的顺序放入栈中,left较right后出栈,所以在rs里left在前,right、root在后。(rs向前插入结点,后插入的结点先访问)
        rs.insert(rs,begin(),p);
        if(p->left!=NULL)
            s.push(p->left);
        if(p->right!=NULL)
            s.push(p->right);
    }
    for(int i = 0; i < rs.size();i++)
        visit(rs[i]);
}

2.3三种遍历方式的转换


//前序加中序转后序


#include<iostream>
#include<cstring>
using namespace std;
char pre[26],mid[26];
void build(int L1,int R1,int L2,int R2)
{
    if(L1 > R1||L2 > R2)
        return ;
    int root = L1 , count = 0;
    while(mid[count+L2]!= pre[root]) count ++;//统计左串长度
    build(L1+1,L1+count,L2,L2+count-1);//将root的左串构造成树
    build(L1+count+1,R1,L2+count+1,R2);//将root的右串构造成树
    cout<<pre[root];//左右子树遍历完,遍历root,就是后序
    return ;
}

int main()
{
    cin>>pre>>mid;
    build(0,strlen(pre)-1,0,strlen(mid)-1);
    return 0;
}

//测试样例 ABDGKLRVWSXCEHMNFIOTUJPYQZ KGVRWLSXDBAMHNECTOUIFPYJZQ
//输出     KVWRXSLGDBMNHETUOIYPZQJFCA 

备注:有的代码可能不能直接运行,存在些许错误,欢迎大家指正。

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值