给定一个二叉树,在树的最后一行找到最左边的值。
思路
层序遍历最为简单,但是递归法也得了解。
层序遍历记录最后一行的第一个节点的数值。
迭代法
层序遍历
class Solution {
public:
int findBottomLeftValue(TreeNode* root) {
queue<TreeNode*> que;
if (root != NULL) que.push(root);
int result = 0;
while (!que.empty()) {
int size = que.size();
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.pop();
if (i == 0) result = node->val; // 记录最后一行第一个元素
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
}
return result;
}
};
根据 i == 0可得最左边的值。
递归法
1. 递归参数和返回值
参数要有传入的根节点和int型的变量记录深度,返回值为空。
2. 终止条件
遇到叶子节点,更新最大深度。
3. 单层逻辑
在找最大深度的时候,递归过程任需使用回溯。
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;
}
};