【LeetCode二叉树#08】寻找树左下角的值(回溯机制X深度)
找树左下角的值
给定一个二叉树,在树的最后一行找到最左边的值。
示例 1:
示例 2:
思路
层序遍历
这个是很自然的思路,因为层序遍历可以避免对于“最底层”这个要求的繁琐判定
在层序遍历的过程中,我们只需要保存最后一层的结果即可
代码
和标准的层序遍历写法一样
class Solution {
public:
//层序遍历
int findBottomLeftValue(TreeNode* root) {
//定义队列
queue<TreeNode*> que;
if(root != NULL) que.push(root);//判定根节点
int res;
while(!que.empty()){//遍历队列
int size = que.size();//记录队列长度
for(int i = 0; i < size; ++i){
TreeNode* node = que.front();
que.pop();
//判断,如果到了最后一层,那么就保存该节点的值
if(i == 0) res = node->val;
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return res;
}
};
递归法
这里使用递归法的话没有层序遍历那么直观,但是因为其涉及到了递归法求深度的概念以及对于回溯的应用,所以还是记录一下
三部曲
1、确定递归函数的参数和返回值
传入参数是根节点,另需要一个变量记录深度的更新值
void traversal(TreeNode* node, int deep){
}
2、确定终止条件
因为我们是靠递归遍历来不断获取深度的
因此当遇到叶子节点时就要更新当前的深度信息
int maxDeep = INT_MIN;
int res;
void traversal(TreeNode* node, int deep){
if(node->left == NULL && node->right == NULL){
if(deep > maxDeep){
maxDeep = deep;//更新深度
//记录当前叶子节点值
res = node->val;
}
return;
}
}
3、确定单层逻辑
使用前序遍历即可,这里依旧要使用回溯
int maxDeep = INT_MIN;
int res;
void traversal(TreeNode* node, int deep){
if(node->left == NULL && node->right == NULL){
if(deep > maxDeep){
maxDeep = deep;//更新深度
//记录当前叶子节点值
res = node->val;
}
return;
}
if(node->left){
//记录深度
deep++;
traversal(node, deep);
//回溯,深度减1
deep--;
}
if(node->right){
//记录深度
deep++;
traversal(node, deep);
//回溯,深度减1
deep--;
}
return;
}
这里使用回溯的主要目的是为了让每个分支都能被遍历到,进而确认每个叶子节点,获取最底层的那个
代码
class Solution {
public:
//递归
//确定递归函数的参数和返回值
int maxDeep = INT_MIN;
int res;
void traversal(TreeNode* node, int deep){
if(node->left == NULL && node->right == NULL){
if(deep > maxDeep){
maxDeep = deep;//更新深度
//记录当前叶子节点值
res = node->val;
}
return;
}
if(node->left){
//记录深度
deep++;
traversal(node->left, deep);
//回溯,深度减1
deep--;
}
if(node->right){
//记录深度
deep++;
traversal(node->right, deep);
//回溯,深度减1
deep--;
}
return;
}
int findBottomLeftValue(TreeNode* root) {
int deep = 0;
traversal(root, deep);
return res;
}
};