回归数据结构——树

简单遍历

class Solution {
public:
    void qian(TreeNode* root,vector<int> &v)
    {
        if(!root)return ;
        v.push_back(root->val);
        qian(root->left,v);
        qian(root->right,v);
    }
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> v;
        qian(root,v);
        return v;
    }
};

递归版本只以前序遍历为例,下面所述遍历均为迭代算法

前序遍历

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> v;
        stack<TreeNode*> s;
        while(!s.empty()||root)
        {
            while(root)//root单兵疯狂向左突破,每次小突破前先搞个人质
            {
                v.push_back(root->val);//搞人质
                s.push(root);
                root=root->left;//突破
            }
            root=s.top();s.pop();//复活
            root=root->right;
        }
        return v;
    }
};

中序遍历

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;
        stack<TreeNode*> s;
        while(!s.empty()||root)
        {
            while(root)//root单兵疯狂向左突破
            {
                s.push(root);
                root=root->left;
            }
            root=s.top();s.pop(); //复活
            ans.push_back(root->val);//大突破完再拉人质
            root=root->right;//向右突破
        }
        return ans;
    }
};

后序遍历

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> v;
        stack<TreeNode*> s;
        TreeNode* t=nullptr;
        while(root||!s.empty())
        {
            while(root)//先向左突破
            {
                s.push(root);
                root=root->left;
            }
            root=s.top();s.pop();//复活
            if(!root->right||root->right==t)//右边没人或上次打过了
            {
                v.push_back(root->val);//人质
                t=root;//给打过的人一个标记
                root=nullptr;//将目标置空,等待下次从栈中获取敌人
            }
            else//右边有新敌人,向右小突一次
            {
                s.push(root);
                root=root->right;
            }
        }
        return v;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
决策算法是一种广泛应用于分类和回归的机器学习算法,它基于形结构对样本进行分类或预测。决策算法的主要思想是通过一系列的判断来对样本进行分类或预测。在决策中,每个节点表示一个属性或特征,每个分支代表该属性或特征的一个取值,而每个叶子节点代表一个分类或预测结果。 决策算法的训练过程主要包括以下步骤: 1. 特征选择:根据某种指标(如信息增益或基尼系数)选择最优的特征作为当前节点的分裂属性。 2. 决策生成:根据选择的特征将数据集分成若干个子集,并递归地生成决策。 3. 剪枝:通过剪枝操作来提高决策的泛化性能。 决策算法的优点包括易于理解和解释、计算复杂度较低、对缺失值不敏感等。但是,决策算法也存在一些缺点,如容易出现过拟合、对离散数据敏感等。 下面是一个决策算法的案例:假设我们要根据一个人的年龄、性别、教育程度和职业预测其收入水平(高于或低于50K)。首先,我们需要将这些特征进行编码,将其转换为数值型数据。然后,我们可以使用决策算法对这些数据进行训练,并生成一个决策模型。最后,我们可以使用该模型对新的数据进行分类或预测。例如,根据一个人的年龄、性别、教育程度和职业,我们可以使用决策模型预测该人的收入水平。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值