代码随想录算法训练营第十六天|leetcode106、112、513题

本文介绍了如何使用层序遍历解决LeetCode第513题,利用回溯法解决第112题(路径和问题),以及通过中序和后序序列构建二叉树(第106题)。详细展示了代码实现及其在数据结构中的应用。
摘要由CSDN通过智能技术生成

一、leetcode第513题

本题要求最左下叶子结点的值,采用层序遍历的方法记录每一层最左侧的结点则覆盖后最后一层的最左侧结点即为所求。

具体代码如下:

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

二、leetcode第112题

本题利用回溯的方法遍历根结点到叶子结点的所有路径,每经过一个结点将目标值减去结点值,当到达叶子结点时若目标值减为零则求出目标路径。

具体代码如下:

class Solution {
public:
    bool hasPathSum(TreeNode* root, int targetSum) {
    if(root==NULL)
    {
        return false;
    }
    return traversal(root,targetSum-root->val);
    }
    bool traversal(TreeNode*root,int sum)
    {
    if(root->left==NULL&&root->right==NULL&&sum==0)
    {
        return true;
    }
    if(root->left==NULL&&root->right==NULL&&sum!=0)
    {
        return false;
    }
    if(root->left)
    {
        sum-=root->left->val;
        if(traversal(root->left,sum)){return true;}
        sum+=root->left->val;
    }
    if(root->right)
    {
        sum-=root->right->val;
        if(traversal(root->right,sum)){return true;}
        sum+=root->right->val;
    }
    return false;
    }
};

三、leetcode第106题

本题要通过中序和后序序列构造二叉树,重点在于分割中序和后序数组进行递归调用,后序的最后一个数值为根结点,可将中序分为左中序和右中序,再根据左中序和右中序的长度将后序数组分为左后序和右后序。

具体代码如下:

class Solution {
private:
TreeNode*gettree(vector<int>& inorder, vector<int>& postorder)
{
    if(postorder.size()==0)
    {
        return NULL;
    }
    int rootval=postorder[postorder.size()-1];
    TreeNode*root=new TreeNode(rootval);
    if(postorder.size()==1){return root;}
    int inindex;
    for(inindex=0;inindex<inorder.size();inindex++)
    {
        if(inorder[inindex]==rootval)
        {
            break;
        }
    }
    vector<int>leftinorder(inorder.begin(),inorder.begin()+inindex);
    vector<int>rightinorder(inorder.begin()+inindex+1,inorder.end());
    postorder.resize(postorder.size()-1);
    vector<int>leftpostorder(postorder.begin(),postorder.begin()+leftinorder.size());
    vector<int>rightpostordr(postorder.begin()+leftinorder.size(),postorder.end());
    root->left=gettree(leftinorder,leftpostorder);
    root->right=gettree(rightinorder,rightpostordr);
    return root;
}
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
    if(inorder.size()==0||postorder.size()==0)
    {
        return NULL;
    }
    return gettree(inorder,postorder);
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值