0
点赞
收藏
分享

微信扫一扫

【力扣-二叉树】10、左叶子之和(404)找到左下角的值(513)


​​404. 左叶子之和​​

题目描述

计算给定二叉树的所有左叶子之和。

示例:

3
/ \
9 20
/ \
15 7

在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

解析

本题的难点在于如何确定是左叶子节点

  • 判断条件:左子树不为空,左子树的左孩子和右孩子均为空

递归法

// 递归法
class Solution
{
public:
int sumOfLeftLeaves(TreeNode *root)
{
return getValue(root);
}
int getValue(TreeNode *node)
{
if (node == NULL)
{
return 0;
}
// 左 右 中
int leftVal = getValue(node->left);
int rightVal = getValue(node->right);

int midValue = 0;
// 判断是否是左子树的叶子节点
if (node->left && !node->left->left && !node->left->right)
{
midValue = node->left->val;
}

return midValue + leftVal + rightVal;
}
};

迭代法

// 递归法
class Solution
{
public:
int sumOfLeftLeaves(TreeNode *root)
{
if (root == NULL)
{
return 0;
}

int sum = 0;
stack<TreeNode *> st;
st.push(root);

while (!st.empty())
{

int size = st.size();
TreeNode *node = st.top();
st.pop();

// 判断左子树不为空,且左子树的左右孩子都为空
if (node->left && !node->left->left && !node->left->right)
{
sum += node->left->val;
}

// 左
if (node->left)
{
st.push(node->left);
}

// 右
if (node->right)
{
st.push(node->right);
}
}
return sum;
}
};

找到左下角的值

题目描述

给定一个二叉树,在树的最后一行找到最左边的值。

示例 1:

【力扣-二叉树】10、左叶子之和(404)找到左下角的值(513)_迭代法

示例 2:

【力扣-二叉树】10、左叶子之和(404)找到左下角的值(513)_子树_02

解析

找到最深层最左侧的节点

递归法

// 递归法
// 前序遍历
// 最后一层的最左侧
class Solution
{
public:
// 全局变量
int maxLen; // 最大深度
int maxLeftVal; // 最大深度最左侧节点的值
int getLeftNodeVal(TreeNode *root)
{
traversal(root, 0);
return maxLeftVal;
}

// 1、确定递归函数的参数与返回值
// 需要遍历整个树时,不能有返回值
// 需要遍历某个路径时,需要有返回值
void traversal(TreeNode *root, int leftLen)
{
// 2、终止递归的条件
if (root->left == NULL && root->right == NULL)
{
if (leftLen > maxLen)
{
maxLen = leftLen;
maxLeftVal = root->val;
}
}
// 3、单层递归的逻辑
if (root->left)
{
leftLen++;
traversal(root->left, leftLen);
leftLen--; //回溯
}

if (root->right)
{
leftLen++;
traversal(root->right, leftLen);
leftLen--;
}
}
};

迭代法

// 迭代法
// 层序遍历
class Solution
{
public:
int getLeftNodeVal(TreeNode *root)
{
if (root == NULL)
{
return 0;
}

queue<TreeNode *> que;
que.push(root);
# 记录每层遍历的节点
# 最后一层的第一个就是需要返回的值
vector<vector<int>> result;

while (!que.empty())
{
// 确定某一层的节点数
int size = que.size();
vector<int> v;
// 遍历
for (int i = 0; i < size; i++)
{
TreeNode *node = que.front();
que.pop();
# 记录节点的值
v.push_back(node->val);
# 存储下一层的节点
if (node->left)
{
que.push(node->left);
}

if (node->right)
{
que.push(node->right);
}
}
result.push_back(v);
}

int size = result.size();
// 返回最深层的第一个节点值
return result[size - 1][0];
}
};


举报

相关推荐

0 条评论