513. 找树左下角的值
class Solution {
public:
int maxDepth = INT_MIN;
int result = 0;
void getLeftVal(TreeNode* node, int depth) {
//中
if(node->left == nullptr && node->right == nullptr) {
if (depth > maxDepth) {
//更新值
maxDepth = depth;
result = node->val;
}
return;
}
//左
if(node->left) getLeftVal(node->left, depth+1);
//右
if(node->right) getLeftVal(node->right, depth+1);
}
int findBottomLeftValue(TreeNode* root) {
getLeftVal(root, 0);
return result;
}
};
112. 路径总和
class Solution {
public:
bool traveller(TreeNode* node, int targetSum) {
//到叶子节点就可以统计
if (node->left == nullptr && node->right == nullptr && targetSum == 0) return true;
if (node->left == nullptr && node->right == nullptr) return false;
if (node->left) {
if (traveller(node->left, targetSum - node->left->val)) return true;
}
if (node->right) {
if (traveller(node->right, targetSum - node->right->val)) return true;
}
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
if (root == nullptr) return false;
return traveller(root, targetSum - root->val);
}
};
//化简
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);
}
};
106. 从中序与后序遍历序列构造二叉树
//这道题有难度
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
//1、如果数组的大小为0, 则说明是空节点
if (postorder.size() == 0) return nullptr;
//2、后序遍历数组的最后一个元素,就是当前的中间节点
int rootVal = postorder[postorder.size()- 1];
TreeNode* root = new TreeNode(rootVal);
//如果该节点是叶子节点,则直接返回
if (postorder.size() == 1) return root;
//3、找出切割点
int i;
for (i = 0; i < inorder.size(); i++) {
if (inorder[i] == rootVal) break;
}
//4、切割中序数组, 分割出中序左数组、右数组,这里采用左闭右开区间
vector<int> leftInoder(inorder.begin(), inorder.begin() + i);
vector<int> rightInoder(inorder.begin()+i+1, inorder.end());
//5、切割出后序数组,分割出后序左数组,右数组 -- 难点
//后序数组的左右子区间的大小跟中序列数组一样
postorder.resize(postorder.size()-1);//最后一个节点已经用过,舍去
vector<int> leftPostOrder(postorder.begin(), postorder.begin()+leftInoder.size());
vector<int> rightPostOrder(postorder.begin()+leftInoder.size(), postorder.end());
//6、处理左节点 、 右节点
root->left = buildTree(leftInoder, leftPostOrder);
root->right = buildTree(rightInoder, rightPostOrder);
return root;
}
};