递归法
题目要求在树的最后一行找到最左边的值
用递归法如何判断是最后一行?其实就是深度最大的叶子节点一定是最后一行。
如何找最左边的深度最大的叶子节点呢?可以使用前序遍历优先在左边进行搜索。
然后记录深度最大的叶子节点,此时就是最后一行最左边的值。
1、确定递归函数的参数及返回值
参数必须有要遍历树的根节点,要有int型的变量用来记录深度最大的叶子节点。此时就是树的最后一行最左边的值
int maxDepth=INT_MIN;//全局变量,用来记录最大深度
int maxleftValue;//全局变量 最大深度最左边的数值。//两者比较,更新
void traversal(TreeNode* root,int leftDepth)
cookie:如果需要遍历整颗树,递归函数就不能有返回值。如果需要遍历某⼀条固定路线,递归函数就⼀定要有返回值!
本题我们是要遍历整个树找到最深的叶⼦节点,需要遍历整颗树,所以递归函数没有返回值。
2、确定终止条件
当遇到叶子节点的时候,就需要统计一下最大深度(遇到叶子节点就更新最大深度)
if(root->left==nullptr&&left->right==nullptr)
{
if(leftDepth>maxDepth)
{
maxDepth=leftDepth;//更新最大深度
maxleftValue=root->val;//最大深度最左边的数值
}
return;
}
3、确定单层递归的逻辑
if(root->left){
leftDepth++; //深度加一
traversal(root->left,leftDepth);
leftDepth--; //回溯,深度减一
}
if(root->right){
leftDepth++;
traversal(root->right,leftDepth);
leftDepth--;
}
完整递归代码:
class Solution{
public:
int maxDepth=INT_MIN;
int maxleftValue;
void traversal(TreeNode* root,int leftDepth){
if(root->left==nullptr&&root->right==nullptr){
if(leftDepth>maxDepth){ //可避免最大深度相同的情况
maxDepth=leftDepth;
maxleftValue=root->val;
}
return;
}
if(root->left){
leftDepth++;
traversal(root->left,leftDepth);
leftDepth--;
}
if(root->right){
leftDepth++;
traversal(root->right,leftDepth);
leftDepth--;
}
}
int findBottomLeftValue(TreeNode* root){
if(root==nullptr) return 0;
traversal(root,1);
return maxleftValue;
}
};
迭代法(最合适)
class Solution {
public:
int findBottomLeftValue(TreeNode* root) {
if(root==nullptr) return 0;
queue<TreeNode*> que;
que.push(root);
int result;
while(!que.empty()){
int size=que.size();
//result=que.front()->val;
for(int ii=0;ii<size;ii++){ //开始一层的遍历
TreeNode* node=que.front();
que.pop();
if(ii==0) result=node->val;//记录每一层的第一个元素(i==0就表示遍历到的是每一层的第一个元素)
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return result;
}
};