树04

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 preOrder(TreeNode* node, bool &flag, int Sum, int &targetSum)
    {
  
        if (node -> left == nullptr && node -> right == nullptr)
        {
            Sum += node->val;
            if (Sum == targetSum)
                flag = true;
            return;
        }
        if(node->left)
            preOrder(node->left, flag, Sum + node -> val, targetSum );
        if(node -> right)
            preOrder(node -> right, flag, Sum + node -> val, targetSum);
    }
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(root == nullptr) return false;
        bool flag = false;
        int Sum = 0;
        preOrder(root, flag, Sum, targetSum);
        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 preOrder(TreeNode *node, int targetSum, vector<int> &path, vector<vector<int>> &result, int pathSum)
    {
        if(node -> left == nullptr && node -> right == nullptr)
        {
            if(pathSum == targetSum)
                result.push_back(path);
            return;
        }
        if (node -> left)
        {
            path.push_back(node -> left -> val);
            preOrder(node -> left, targetSum, path, result, pathSum + node -> left -> val);
            path.pop_back();
        } 
         if (node -> right)
        {
            path.push_back(node -> right -> val);
            preOrder(node -> right, targetSum, path, result, pathSum + node -> right -> val);
            path.pop_back();
        } 
    }
    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
        vector<vector<int>> result;
        vector<int> path;
        if (root == nullptr) return result;
        path.push_back(root -> val);
        int pathSum = root -> val;
        preOrder(root, targetSum, path, result, pathSum);
        return result;
    }
};

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* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if (postorder.size() == 0) return nullptr;
        TreeNode *root = new TreeNode(postorder[postorder.size() - 1]);
        if (postorder.size() == 1) return root;
        int index = 0;
        for (; index < inorder.size(); index++)
        {
            if(inorder[index] == root -> val)
                break;
        }
        vector<int> leftInorder(inorder.begin(), inorder.begin() + index);
        vector<int> rightInorder(inorder.begin() + index + 1, inorder.end());

        vector<int> leftPostorder(postorder.begin(), postorder.begin() + leftInorder.size());
        vector<int> rightPostorder(postorder.begin() + leftInorder.size(), postorder.end() - 1);
        root -> left = buildTree(leftInorder, leftPostorder);
        root -> right = buildTree(rightInorder, rightPostorder);
        return root;
     }
};

654. 最大二叉树

/**
 * 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* constructMaximumBinaryTree(vector<int>& nums) {
        if(nums.size() == 0) return nullptr;
        int index = 0;
        int ref = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            if(ref < nums[i])
            {
                ref = nums[i];
                index = i;
            }
        }
        TreeNode* root = new TreeNode(nums[index]);
        vector<int> leftnums(nums.begin(), nums.begin() + index);
        vector<int> rightnums(nums.begin() + index + 1, nums.end());
        root -> left = constructMaximumBinaryTree(leftnums);
        root -> right = constructMaximumBinaryTree(rightnums);
        return root;
    }
};
posted @ 2025-07-29 10:14  skyler886  阅读(6)  评论(0)    收藏  举报