简单树算法问题 - 代码案例

什么是树?一种存储结构;什么是树?一个元素集合;什么是树,一类生活规律;

树的定义
在树里存储的元素叫做结点,而树就是n(n>=0)个结点的集合;
if(n==0)
cout<<" 空树 ";
else
{
每一颗大树有许多片树叶,但是只有一个根部;同理,在非空树里有且仅有一个结点叫做根节点;它是非空树最开始的结点,其它结点都是接在它后面;
n>1时:
一颗树中可以有许多棵子树:结点通过顺序关系连接起来,而这些结点的小集合也可以叫做子树;
现实里一棵树的两个分支不可能长着长着又连在一起了,在数据结构里的树也一样,两个子树的之间是没有交际的,它们之间的任意结点不存在连线;
}

树的基本名词
1.度
结点的度:该结点拥有的子树的个数叫做结点的度;
树的度:树所拥有的结点的度最大值;
2.叶子与枝干
度为0的结点为叶子结点(终端结点);
度不为0的结点为分支结点(非终端结点);
3.结点分类
孩子结点:某结点的子树的根节点为该结点的孩子结点;
双亲结点:孩子结点的上级;
兄弟结点:具有同一个双亲的孩子结点为兄弟结点;
4.树的属性:
路径:从某结点到目标结点走的路(唯一);
路径长度:路径上经过的边数;
5.家族关系
祖先:某路径的头结点称为尾结点的祖先;
子孙:某子树,除了根节点的结点都是根节点的子孙;
6.结点的属性
结点的层数
树的深度:结点层数的最大值;
树的宽度:各层结点个数的最大值;

在这里插入图片描述

Accepted_code:

#include<iostream>
using namespace std;
int cs(int i){  // 某结点的层数
    int num=0;
    int d=1;
    while(d<=i)  // i只要大于每层的第一个树就满足
    {
        ++num;
        d=d*2;
    }
    return num;
}
int pf(int t){  // 每层的最右边的结点  t层的结点数
    int r=0;
    for(int i=1;i<=t;++i)
        r=r*2+1;
     return r;
}
int zuo(int t){  //第t层的结点数
   int i=1;
   for(int r=1;r<t;++r)
    i*=2;
   return i;
}
int you(int a,int b){  // 结点a开始,b层后的最右边结点
   for(int i=1;i<=b;++i)
    a=2*a+1;
   return a;
}
int yyou(int a,int b){  // 结点a开始,b层后的最左边结点
   for(int i=1;i<=b;++i)
    a=2*a;
   return a;
}
int main()
{
    int m,n;
    while(cin>>m>>n&&(m!=0||n!=0))
    {
        int number,ln,sn; // 总数 = 子树结点树 + 叶结点数
        int dm,dn; // m,n所在层数
        dm = cs(m);
        dn = cs(n);
        int l = dn-dm;  //层数差
        if(l==0)  // m结点在最后一层
            number=1;
        else
        {
            if(cs(m)==1)
                number=n;
            else
            {
                ln = pf(l);
                if(n<2*m)
                    sn=0;
                else
                {
                    int wei = you(m,l);  // 11的位置
				    int tou = yyou(m,l);  // 11的位置
				    
					if(n>wei)
                        sn=wei-tou+1;
                    else
                        sn =n-tou+1;
					if(tou>n)
					 sn=0;
                }
			
				 number=ln+sn;
		    }
        }
        cout<<number<<endl;
    }
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我会尽力为您解答。首先,决策算法是一种基于结构的分类算法,可以用于预测事物的分类或属性。而Titanic乘客存活率预测是一个经典的机器学习案例,我们可以通过优化代码来提高预测的准确性和效率。 以下是一些可以优化决策算法实现Titanic乘客存活率预测的方法: 1. 数据预处理:在进行决策算法之前,我们需要对数据进行预处理,包括缺失值处理、数据类型转换、特征选择等。可以使用pandas库来进行数据的读取和处理。 2. 特征工程:特征工程是指对原始数据进行特征提取和转换的过程,可以提高模型的预测准确性。可以使用sklearn库中的特征选择工具和特征转换工具来进行特征工程。 3. 模型选择和调参:决策算法有多种实现方式,如ID3、C4.5、CART等。可以通过交叉验证和网格搜索等方法来选择最优的模型和参数。 4. 模型评估:在使用决策算法进行预测时,需要对模型进行评估,包括准确率、精确率、召回率等指标。可以使用sklearn库中的评估工具来进行模型评估。 下面是一个决策算法实现Titanic乘客存活率预测的示例代码: ```python import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 读取数据 data = pd.read_csv('train.csv') # 数据预处理 data['Age'].fillna(data['Age'].mean(), inplace=True) data.drop(['Cabin', 'Name', 'Ticket'], axis=1, inplace=True) data['Embarked'].fillna('S', inplace=True) data['Sex'] = data['Sex'].map({'male': 0, 'female': 1}) data['Embarked'] = data['Embarked'].map({'S': 0, 'C': 1, 'Q': 2}) # 特征工程 X = data.drop(['Survived'], axis=1) y = data['Survived'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) # 模型训练 clf = DecisionTreeClassifier() clf.fit(X_train, y_train) # 模型预测 y_pred = clf.predict(X_test) print('Accuracy:', accuracy_score(y_test, y_pred)) ``` 以上代码实现了数据预处理、特征工程、模型训练和模型预测等步骤,通过使用sklearn库中的决策算法进行预测,并计算了预测的准确率。需要注意的是,这只是一个简单示例代码,实际优化还需要考虑更多的因素,如特征选择、模型调参、集成学习等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的clz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值