刷题《剑指Offer》day13

题目来源:力扣《剑指Offer》第二版
完成时间:2022/08/08

34. 二叉树中和为某一值的路径

image-20220815162710700

题目链接:剑指 Offer 34. 二叉树中和为某一值的路径 - 力扣(LeetCode)

我的题解

这题用深搜就行了,套模板的题目

/**
 * 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:
    vector<vector<int>> result;
    vector<int> res;
    int sum = 0;

    void traverse(TreeNode* node, int target) {
    
    
        sum += node->val;
        res.push_back(node->val);
        if(sum == target && node->left == nullptr && node->right == nullptr){
    
    
            result.push_back(res);
        }
        if(node->left){
    
    
            traverse(node->left,target);
        } 
        if(node->right){
    
    
            traverse(node->right,target);
        }
        sum -= node->val;
        res.pop_back();
    }

    vector<vector<int>> pathSum(TreeNode* root, int target) {
    
    
        if(root != nullptr)
            traverse(root,target);
        return result;
    }
};

33. 二叉搜索树的后序遍历序列

image-20220815163817941

题目链接:剑指 Offer 33. 二叉搜索树的后序遍历序列 - 力扣(LeetCode)

我的题解

这题可以借鉴由中序遍历和前(后)序遍历得出二叉树来做。因为有后续遍历的序列,那么最尾的元素一定是子树根节点,又是二叉搜索树,则可以分成两部分,前一部分是左子树比根节点小,后部分是右子树比根节点大。只需要验证后部分是否都比根节点小即可。

class Solution {
    
    
public:
    bool verifyPostorder(vector<int>& postorder) {
    
    
        if(postorder.size() == 0) return true;
        int root = postorder[postorder.size()-1];
        int i = 0;
        while(postorder[i] < root){
    
    
            i++;
        }
        postorder.pop_back();
        if(postorder.size() != 0){
    
    
            vector<int> rightorder(postorder.begin(),postorder.begin() + i);
            vector<int> leftorder(postorder.begin() + i,postorder.end());
            for(;i < postorder.size();i++){
    
    
                if(postorder[i] < root){
    
    
                    return false;
                }
            }
            return verifyPostorder(rightorder) && verifyPostorder(leftorder);
        }else{
    
    
            return true;
        }
    }
};

猜你喜欢

转载自blog.csdn.net/m0_46369272/article/details/126350022