训练营打卡Day18

训练营打卡Day18

题45:513. 找树左下角的值

思路(递归法)

  • 在遍历树的过程中记录每个叶子节点的深度
  • 如果发现当前叶子节点的深度比之前记录的最大深度还大,就更新最大深度并记录当前叶子节点的值。
  • 最后返回记录最左下角叶子节点的值。

使用递归的方法来遍历整棵树

  • 在函数traversal中,如果当前节点没有左子节点和右子节点,那么它就是一个叶子节点。如果当前节点的深度大于之前记录的最大深度,就更新最大深度并记录当前节点的值。
  • 否则,如果当前节点有左子节点,就递归调用 traversal 函数,并将左子节点作为参数,深度加 1。
  • 如果当前节点有右子节点,就递归调用 traversal 函数,并将右子节点作为参数,深度加 1。

在函数 findBottomLeftValue 中,调用 traversal 函数,并以根节点作为参数,深度设为 0 开始遍历整棵树。

代码(递归法)

class Solution {
public:
    int maxDep = INT_MIN;
    int ans;
    void traversal(TreeNode* node, int depth)
    {
        if(!node->left && !node->right)
        {
            if(maxDep < depth)
            {
                maxDep = depth;
                ans = node->val;
            }
            return;
        }

        if(node->left)
        {
            traversal(node->left, depth+1);
        }

        if(node->right)
        {
            traversal(node->right, depth+1);
        }
    }

    int findBottomLeftValue(TreeNode* root) {
        traversal(root, 0);
        return ans;
    }
};

思路(迭代法)

  1. 使用一个队列来保存当前需要访问的节点
  2. 从根节点开始,将根节点入队。
  3. 只要队列不为空,就取出队首节点,并将其左子节点和右子节点加入队尾。
  4. 当遍历完一层的节点时,就记录当前队首节点的值。
  5. 重复3和4,直到队列为空

在循环中,每次取出队首节点,并将其左子节点和右子节点加入队尾。如果当前节点是当前层的第一个节点,就记录当前节点的值。

代码(迭代法)

class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        if(!root) return -1;
        queue<TreeNode*>que;
        que.push(root);
        int ans;
        while(!que.empty())
        {
            int n = que.size();
            for(int i = 0; i < n; i++)
            {            
                auto node = que.front();
                que.pop();
                if(node->left) que.push(node->left);
                if(node->right) que.push(node->right);
                if(i == 0) ans = node->val;
            }
        }
        return ans;
    }
};

题46:112. 路径总和

思路

  1. 使用递归的方式遍历整棵树
  2. 在遍历过程中,如果当前节点是叶子节点,并且它的值等于目标值,就返回true.
  3. 否则,如果当前节点有左子节点,就递归调用traversal函数,并将左子节点作为参数,目标值减去当前节点的值。
  4. 如果当前节点有右子节点,就递归调用traversal函数,并将右子节点作为参数,目标值减去当前节点的值。
  5. 如果上述步骤均不成立,就返回false。

在函数hasPathSum中,调用traversal函数,并以根节点作为参数,目标值作为参数开始遍历整棵树。最后,返回traversal函数的返回值,表示是否找到了符合要求的路径。

代码

class Solution {
public:

    bool traversal(TreeNode* node, int targetSum)
    {
        if(!node->left && !node->right && targetSum == node->val)
            return true;


        if(node->left && traversal(node->left, targetSum - node->val))
            return true;

        if(node->right && traversal(node->right, targetSum - node->val))
            return true;

        return false;
    }


    bool hasPathSum(TreeNode* root, int targetSum) {
        if(!root) return false;
        return traversal(root, targetSum);
    }
};

题47:106. 从中序与后序遍历序列构造二叉树

思路

  1. 如果后序遍历序列为空,就返回NULL。
  2. 否则,从后续遍历中取出最后一个元素,作为当前节点的值。
  3. 如果后序遍历序列只包含一个元素,就返回当前节点。
  4. 否则,在中序遍历序列中查找当前节点的值。
  5. 将中序遍历序列分为当前节点左边和右边两个部分,分别对应当前节点的左子树和右子树。
  6. 将后序遍历序列也分为两个部分,分别对应左子树和右子树。
  7. 递归地调用buildTree函数,分别构建左子树和右子树。
  8. 返回当前节点

代码

class Solution {
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        
        if(postorder.size() == 0) return NULL;
        
        int rootVal = postorder[postorder.size()-1];

        TreeNode *node = new TreeNode(rootVal);
        if(postorder.size() == 1) return node;

        int index = 0;

        while(index < inorder.size())
        {
            if(inorder[index] == rootVal) break;\
            index++;
        }

        vector<int>leftIn(inorder.begin(), inorder.begin()+index);
        vector<int>rightIn(inorder.begin()+index+1, inorder.end());

        vector<int>leftPost(postorder.begin(), postorder.begin()+leftIn.size());
        vector<int>rightPost(postorder.begin()+leftIn.size(), postorder.end()-1);
        node->left = buildTree(leftIn, leftPost);
        node->right = buildTree(rightIn, rightPost);
        return node;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
工程训练大赛开环打卡赛题是关于AI凸轮设计的任务,我们可以在CSDN上找到相关的应用程序(App)。 AI凸轮设计是一项利用人工智能技术开发的凸轮设计方法,它可以优化凸轮的设计过程,提高凸轮在机械系统中的性能。这个赛题要求我们设计一个可以帮助工程师进行AI凸轮设计的应用程序。 在CSDN上搜索相关内容,我们可以找到很多与AI凸轮设计相关的技术文章和项目案例。这些资源可以帮助我们了解AI凸轮设计的基本原理和应用方法。 针对这个任务,我们可以开发一个名为"AI凸轮设计App"的移动应用程序。这个App将提供以下功能: 1. 数据收集与分析:用户可以输入相关机械系统的参数和要求,然后App会收集并分析这些数据,为凸轮设计提供参考。 2. AI凸轮设计算法:App内嵌有AI凸轮设计算法模块,可以自动计算和优化凸轮的设计。 3. 可视化展示:App可以将AI凸轮设计的结果以可视化的方式展示给用户,包括凸轮的形状、尺寸和运动轨迹等。 4. 参数调整和优化:用户可以通过调整输入参数来进一步优化凸轮设计,App会即时更新设计结果。 5. 数据导出:用户可以将AI凸轮设计的结果导出为文件,以供其他工程软件或设备使用。 通过这个"AI凸轮设计App",工程师可以更加高效地设计凸轮,减少人工设计的工作量,提高设计的准确性和效率。这个App还可以为工程师提供参考,帮助他们更好地理解AI凸轮设计的原理和应用。 总的来说,通过开发这款应用程序,我们可以方便工程师在移动设备上进行AI凸轮设计,提高设计效率和准确性,推动工程技术的发展和应用。这也符合工程训练大赛开展的宗旨和主题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值