513.找树最下角的值
题目链接:513. 找树左下角的值 - 力扣(LeetCode)
题解:
本体还是使用递归法,但使用递归并不是一直向左遍历,应该是先到最后一行然后是最左边的值,其实就是深度最大的叶子节点。那么依旧是递归三部曲。
1.确定递归函数的参数和返回值
int maxDepth = INT_MIN;
int result;
void traversal(TreeNode* root, int depth)
2.确定终止条件
if(root->left == NULL && root->right ==NULL) {
if(depth > maxDepth){
maxDepth = depth;
result = root->val;
}
return;
}
3.确定单层递归逻辑(注:回溯出现)
if (root->left)
depth++;
traversal(root->left, depth);
depth--;
}
if (root->right) {
depth++;
traversal(root->right, depth);
depth--;
}
return;
总结C++代码如下:
class Solution {
public:
int maxDepth = INT_MIN;
int result;
void traversal(TreeNode* root, int depth) {
if (root->left == NULL && root->right == NULL) {
if (depth > maxDepth) {
maxDepth = depth;
result = root->val;
}
return;
}
if (root->left) {
depth++;
traversal(root->left, depth);
depth--; // 回溯
}
if (root->right) {
depth++;
traversal(root->right, depth);
depth--; // 回溯
}
return;
}
int findBottomLeftValue(TreeNode* root) {
traversal(root, 0);
return result;
}
};
112.路经总和
题目链接: 112. 路径总和 - 力扣(LeetCode)
题解:
1.确定递归函数的参数和返回类型
参数首先得有根节点,还需要一个计数器,计数器用来计算总和是否和目标值相同
接下来是返回值问题,关于是否需要返回值有如下三点
(1):如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。
(2):如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。
(3): 如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。(本题的情况)
讲解图:
bool traversal(treenode* cur, int count)
2.确定终止条件(不要去累加然后判断是否等于目标和,那么代码比较麻烦,可以用递减,让计数器count初始为目标和,然后每次减去遍历路径节点上的数值,如果最后count == 0,同时到了叶子节点的话,说明找到了目标和。)
if (!cur->left && !cur->right && count == 0) return true;
if (!cur->left && !cur->right) return false;
3.确定单层递归的逻辑
因为终止条件是判断叶子节点,所以递归发过程中就不要让空节点进入递归
if(cur->left){
if (traversal(cur->left, count - cur->left->val)) return ture;
}
if(cur->right){
if(tarversal(cur->right,count - cur->right->val)) return ture;
}
return false;
总结C++代码如下:
class Solution {
private:
bool traversal(TreeNode* cur, int count) {
if (!cur->left && !cur->right && count == 0) return true; // 遇到叶子节点,并且计数为0
if (!cur->left && !cur->right) return false; // 遇到叶子节点直接返回
if (cur->left) { // 左
count -= cur->left->val; // 递归,处理节点;
if (traversal(cur->left, count)) return true;
count += cur->left->val; // 回溯,撤销处理结果
}
if (cur->right) { // 右
count -= cur->right->val; // 递归,处理节点;
if (traversal(cur->right, count)) return true;
count += cur->right->val; // 回溯,撤销处理结果
}
return false;
}
public:
bool hasPathSum(TreeNode* root, int sum) {
if (root == NULL) return false;
return traversal(root, sum - root->val);
}
};