马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
标题泉源:. - 力扣(LeetCode)
标题思绪分析
标题要求盘算给定二叉树中全部左叶子节点的和。叶子节点是指没有子节点的节点。左叶子节点是指位于某个节点的左子树中的叶子节点。
办理这个标题标思绪如下:
- 界说叶子节点:起首,我们必要一个函数来判定一个节点是否是叶子节点。
- 递归遍历:然后,我们利用递归的方法遍历整棵树。
- 判定和累加:在遍历的过程中,我们查抄当前节点的左子节点,假如它是叶子节点,则将其值累加到结果中;假如不是叶子节点,则递归地皮算其左子树中全部左叶子节点的和。对于右子树,我们只需递归地皮算其全部左叶子节点的和(由于当前节点的右子树与当前节点的左叶子节点无关)。
代码:
- /**
- * Definition for a binary tree node.
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode() : val(0), left(nullptr), right(nullptr) {}
- * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
- * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
- * };
- */
- class Solution {
- public:
- // 判断一个节点是否是叶子节点
- bool isLeaves(TreeNode* root){
- // 叶子节点没有左子节点和右子节点
- return (!root->left && !root->right);
- }
-
- // 计算二叉树中所有左叶子节点的和
- int sumOfLeftLeaves(TreeNode* root) {
- // 如果当前节点为空,返回0
- if(!root) return 0;
-
- int ans = 0;
-
- // 检查左子节点
- if(root->left){
- // 如果左子节点是叶子节点,将其值累加到结果中
- // 否则,递归地计算其左子树中所有左叶子节点的和
- ans += isLeaves(root->left) ? root->left->val : sumOfLeftLeaves(root->left);
- }
-
- // 对于右子树,只需递归地计算其所有左叶子节点的和
- // 注意:这里先检查root->right是否存在且不是叶子节点,以优化性能
- if(root->right && !isLeaves(root->right)){
- ans += sumOfLeftLeaves(root->right);
- }
-
- return ans;
- }
- };
复制代码 知识点择要
- 叶子节点的界说:没有左子节点和右子节点的节点被称为叶子节点。
- 递归遍历:递归是一种办理树布局标题标常用方法,通过不停地将标题分解为子标题来办理。
- 条件判定:在编程中,利用条件判定语句(如if语句)来根据条件实验差别的代码块。
- 累加利用:利用累加器(如变量ans)来存储和盘算一系列数值的总和。
通过本题,我们学习了怎样判定一个节点是否是叶子节点,以及怎样利用递归的方法遍历二叉树并盘算特定节点的和。递归是一种强盛的编程本领,特殊实用于办理树布局干系的标题。在实际应用中,我们还必要注意递归的深度,以制止出现栈溢出等标题。通过不停地练习和思索,我们可以更加熟练地把握这种本领,并将其应用于更复杂的场景中。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |