代码随想录day16二叉树4

文章目录

  • 513.找树左下角的值
  • 112. 路径总和
  • 113. 路径总和 II
  • 106.从中序与后序遍历序列构造二叉树
  • 105. 从前序与中序遍历序列构造二叉树

513.找树左下角的值

题目链接
文章讲解

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        queue<TreeNode*> q;
        if(root) q.push(root);
        vector<int> res;
        int ans=0;
        while(!q.empty())
        {
        int k=q.size();
        bool flag=false;
        while(k--)
            {
            TreeNode* node=q.front();
            q.pop();
            //每次存最左边的值
            if(!flag) {ans=node->val;
            flag=true;}
            if(node->left) q.push(node->left);
            if(node->right) q.push(node->right);
        
            }
            
        }
        return ans;
    }
};

112. 路径总和

题目链接
文章讲解

参照昨天的二叉树的所有路径

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void all(TreeNode* cur,vector<int>& path,int targetSum,bool& flag)
    {
         path.push_back(cur->val);
        if(!cur->left&&!cur->right)
        {
            int ans=0;
            for(int i=0;i<path.size();i++)
            {
                ans+=path[i];
            }
            if(ans==targetSum) flag=true;
        }
         if(cur->left)
        {
            all(cur->left,path,targetSum,flag);
            path.pop_back();
        }
         if(cur->right)
        {
            all(cur->right,path,targetSum,flag);
            path.pop_back();
        }
    }
    bool hasPathSum(TreeNode* root, int targetSum) {
        vector<int> path;
        bool flag=false;
        if(root==NULL) return false;
         all(root,path,targetSum,flag);
        return flag;
    }
};

113. 路径总和 II

题目链接
文章讲解

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
 void all(TreeNode* cur,vector<int>& path,int targetSum,vector<vector<int>>& res)
    {
         path.push_back(cur->val);
        if(!cur->left&&!cur->right)
        {
            int ans=0;
            for(int i=0;i<path.size();i++)
            {
                ans+=path[i];
            }
            if(ans==targetSum) 
            {
                res.push_back(path);
            }
        }
         if(cur->left)
        {
            all(cur->left,path,targetSum,res);
            path.pop_back();
        }
         if(cur->right)
        {
            all(cur->right,path,targetSum,res);
            path.pop_back();
        }
    }
    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
        vector<int> path;
        vector<vector<int>> res;
        if(root==NULL) return res;
        all(root,path,targetSum,res);
        return res;
    }
};

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

题目链接
文章讲解

第一步:如果数组大小为零的话,说明是空节点了。

第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。

第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点

第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)

第五步:切割后序数组,切成后序左数组和后序右数组

第六步:递归处理左区间和右区间

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* solve(vector<int>& inorder, vector<int>& postorder)
    {
        if(postorder.size()==0) return NULL;
        int fenge=postorder[postorder.size()-1];
        TreeNode* node=new TreeNode(fenge);
        if(postorder.size()==1) return node;
        int k=0;
        for(int i=0;i<inorder.size();i++)
        {
            if(inorder[i]==fenge)
            {
                k=i;
                break;
            }
        }

        vector<int> leftinorder(inorder.begin(),inorder.begin()+k);
        //特别注意这里要加1
        vector<int> rightinorder(inorder.begin()+k+1,inorder.end());
        postorder.pop_back();
        vector<int> leftpostorder(postorder.begin(),postorder.begin()+leftinorder.size());
        vector<int> rightpostorder(postorder.begin()+leftinorder.size(),postorder.end());

        node->left=solve(leftinorder,leftpostorder);
        node->right=solve(rightinorder,rightpostorder);

        return node;

    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if(inorder.size()==0||postorder.size()==0) return NULL;
        return solve(inorder,postorder);
    }
};

105. 从前序与中序遍历序列构造二叉树

题目链接
文章讲解

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* solve(vector<int>& preorder, vector<int>& inorder)
    {
        if(preorder.size()==0)  return NULL;
         int fenge=preorder[0];
        TreeNode* node=new TreeNode(fenge);
        if(preorder.size()==1) return node;
        int k;
        for(int i=0;i<inorder.size();i++)
        {
            if(inorder[i]==fenge)
            {
                k=i;
                break;
            }
        }

        vector<int> leftinorder(inorder.begin(),inorder.begin()+k);
        vector<int> rightinorder(inorder.begin()+k+1,inorder.end());
        preorder.erase(preorder.begin());
        vector<int> leftpreorder(preorder.begin(),preorder.begin()+leftinorder.size());
        vector<int> rightpreorder(preorder.begin()+leftinorder.size(),preorder.end());
        
        node->left=solve(leftpreorder,leftinorder);
        node->right=solve(rightpreorder,rightinorder);
        return node;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.size()==0||inorder.size()==0) return NULL;
        return solve(preorder,inorder);
    }
};

你可能感兴趣的:(二叉树,数据结构)