513.找树左下角的值
题目链接
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 max_depth = 0;
int left_val = 0;
void findBottomLeftValue_2(TreeNode* root, int depth) {
if (root == nullptr) return;
findBottomLeftValue_2(root->left, depth + 1);
findBottomLeftValue_2(root->right, depth + 1);
if (root->left == nullptr && root->right == nullptr) {
if (depth > max_depth) {
max_depth = depth;
left_val = root->val;
}
}
}
int findBottomLeftValue(TreeNode* root) {
findBottomLeftValue_2(root, 1);
return left_val;
}
};
112. 路径总和 113.路径总和ii
题目链接
112. 路径总和
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:
bool hasPathSum(TreeNode* root, int targetSum) {
if (root == nullptr) return false;
if (root->left == nullptr && root->right == nullptr && targetSum == root->val) return true;
return hasPathSum(root->left, targetSum - root->val) || hasPathSum(root->right, targetSum - root->val);
}
};
//路径总和2
/**
* 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>> res;
void pathSum_2(TreeNode* root, int targetSum, vector<int> path) {
if (root == nullptr) return;
path.push_back(root->val);
if (root->left == nullptr && root->right == nullptr && targetSum == root->val) {
res.push_back(path);
};
pathSum_2(root->left, targetSum - root->val, path);
pathSum_2(root->right, targetSum - root->val, path);
path.pop_back();
}
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
vector<int> path;
pathSum_2(root, targetSum, path);
return res;
}
};
106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
题目链接
106. 从中序与后序遍历序列构造二叉树
105. 从前序与中序遍历序列构造二叉树
我的题解
//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) {
int len = inorder.size();
if (len == 0) return nullptr;
int val = postorder[len - 1];
int index = 0;
while (index < len && inorder[index] != val) index ++;
TreeNode* node = new TreeNode(val);
vector<int> left_inorder(inorder.begin(), inorder.begin() + index);
vector<int> left_postorder(postorder.begin(), postorder.begin() + index);
node->left = buildTree(left_inorder, left_postorder);
vector<int> right_inorder(inorder.begin() + index + 1, inorder.end());
vector<int> right_postorder(postorder.begin() + index, postorder.end() - 1);
node->right = buildTree(right_inorder, right_postorder);
return node;
}
};
//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* buildTree_2(vector<int>& preorder, vector<int>& inorder, int p_begin, int p_end, int i_begin, int i_end) {
int len = p_end - p_begin;
if (len == 0) return nullptr;
int val = preorder[p_begin];
int index = 0;
while (i_begin + index < i_end && inorder[i_begin + index] != val) index ++;
TreeNode* node = new TreeNode(val);
node->left = buildTree_2(preorder, inorder, p_begin + 1, p_begin + 1 + index, i_begin, i_begin + index);
node->right = buildTree_2(preorder, inorder, p_begin + 1 + index, p_end, i_begin + index + 1, i_end);
return node;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return buildTree_2(preorder, inorder, 0, preorder.size(), 0, inorder.size());
}
};