Day16
513.找二叉树左下角的值
本题使用迭代法更简单,使用迭代法和递归法的区别是什么
递归法
目标就是找深度最大的叶子结点
无论前中后序遍历,都是左节点先被遍历到,所以一旦得到深度最大的节点,就是最后一行最靠左侧的节点
这里没有处理中的逻辑,因为前中后序都可以,只要强调左在右的前面
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;
}
};
一个节点只知道它的左右孩子节点而不知道它的父节点,而回溯实际上并不需要知道父节点,因为它利用了函数调用栈和局部变量的特性。
以下是具体的递归过程: