网站公告:
Welcome!
注册账号送55元
注册账号送55元 做了这么众题现在了,会求左叶子之和么?
添加时间:2021-08-09 10:59 来源:未知 作者:admin

左叶子之和

题现在地址:https://leetcode-cn.com/problems/sum-of-left-leaves/

计算给定二叉树的一切左叶子之和。

日前,《黑神话:悟空》战斗策划离职引起了不小的风波,引得游戏科学的联合创始人杨奇在微博上进行了一次回复。不过由于最近部分媒体和自媒体对该事件的过度报道,为此杨奇先生又专门发了一条微博来回应此事件。

《奇异人生》系列的新作《奇异人生:本色》发布了最新宣传片,介绍了游戏主角所在的Haven Springs小镇。玩家可以在镇子里进行游览、游玩小游戏等活动,也可以与NPC交流并逐步发现隐藏的剧情。一起来看看吧!

开发商Heart Machine的冒险游戏《太阳灰国》放出了新的发售日期预告,游戏将于2021年10月26日登陆PS4/PS5/EPIC商城。

拳头公司曾在2018年就因性骚扰和性别歧视遭到起诉,最后支付了1000万美元的赔偿费用进行了和解。后来拳头又试图将案件转移至私人仲裁听证会,最后因员工以罢工相要挟才放弃强制仲裁。

今日,万代南梦宫在官方油管频道上发布了《破晓传说》中角色奇莎兰的个人预告,简单展示了一小部分游戏过场与角色实机游玩。下面为大家带来预告视频。

示例:

思路

最先要仔细是判定左叶子,不是二叉树左侧节点,于是不要上来想着层序遍历。

由于题现在中其实异国说懂得左叶子原形是什么节点,那么吾来给出左叶子的清晰定义:倘若左节点不为空,且左节点异国旁边孩子,那么这个节点就是左叶子

行家思考一下如下图中二叉树,左叶子之和原形是众少?

其实是0,由于这棵树根本异国左叶子!

那么判定现在节点是不是左叶子是无法判定的,必须要议决节点的父节点来判定其左孩子是不是左叶子。

倘若该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子,判定代码如下:

if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {     左叶子节点处理逻辑 } 
递归法

递归的遍历挨次为后序遍历(旁边中),是由于要议决递归函数的返回值来累添求取左叶子数值之和。。

递归三部弯:

1.确定递归函数的参数和返回值

判定一个树的左叶子节点之和,那么必定要传入树的根节点,递归函数的返回值为数值之和,于是为int

行使题现在中给出的函数就能够了。

2.确定终止条件

照样是

if (root == NULL) return 0; 

3.确定单层递归的逻辑

当遇到左叶子节点的时候,记录数值,然后议决递归求取左子树左叶子之和,和 右子树左叶子之和,相添便是整个树的左叶子之和。

代码如下:

int leftValue = sumOfLeftLeaves(root->left);    // 左 int rightValue = sumOfLeftLeaves(root->right);  // 右                                                 // 中 int midValue = 0; if (root->left && !root->left->left && !root->left->right) {     midValue = root->left->val; } int sum = midValue + leftValue + rightValue; return sum; 

团体递归代码如下:

class Solution { public:     int sumOfLeftLeaves(TreeNode* root) {         if (root == NULL) return 0;          int leftValue = sumOfLeftLeaves(root->left);    // 左         int rightValue = sumOfLeftLeaves(root->right);  // 右                                                         // 中         int midValue = 0;         if (root->left && !root->left->left && !root->left->right) { // 中             midValue = root->left->val;         }         int sum = midValue + leftValue + rightValue;         return sum;     } }; 

以上代码精简之后如下:

class Solution { public:     int sumOfLeftLeaves(TreeNode* root) {         if (root == NULL) return 0;         int midValue = 0;         if (root->left != NULL && root->left->left == NULL && root->left->right == NULL) {             midValue = root->left->val;         }         return midValue + sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);     } }; 
迭代法

本题迭代法行使前中后序都是能够的,只要把左叶子节点统计出来,就能够了,那么参考文章 二叉树:听说递归能做的,栈也能做!和二叉树:迭代法同一写法中的写法,能够写出一个前序遍历的迭代法。

判定条件都是相通的,代码如下:

class Solution { public:     int sumOfLeftLeaves(TreeNode* root) {         stack<TreeNode*> st;         if (root == NULL) return 0;         st.push(root);         int result = 0;         while (!st.empty()) {             TreeNode* node = st.top();             st.pop();             if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {                 result += node->left->val;             }             if (node->right) st.push(node->right);             if (node->left) st.push(node->left);         }         return result;     } }; 
总结

这道题现在请求左叶子之和,其实是比较绕的,由于不及判定本节点是不是左叶子节点。

此时就要议决节点的父节点来判定其左孩子是不是左叶子了。

往往吾们解二叉树的题现在时,已经习性了议决节点的旁边孩子判定本节点的属性,而本题吾们要议决节点的父节点判定本节点的属性。

期待议决这道题现在,能够扩展行家对二叉树的解题思路。

其他说话版本 Java

递归

class Solution {     public int sumOfLeftLeaves(TreeNode root) {         if (root == null) return 0;         int leftValue = sumOfLeftLeaves(root.left);    // 左         int rightValue = sumOfLeftLeaves(root.right);  // 右                                                                 int midValue = 0;         if (root.left != null && root.left.left == null && root.left.right == null) { // 中             midValue = root.left.val;         }         int sum = midValue + leftValue + rightValue;         return sum;     } } 

迭代

class Solution {     public int sumOfLeftLeaves(TreeNode root) {         if (root == null) return 0;         Stack<TreeNode> stack = new Stack<> ();         stack.add(root);         int result = 0;         while (!stack.isEmpty()) {             TreeNode node = stack.pop();             if (node.left != null && node.left.left == null && node.left.right == null) {                 result += node.left.val;             }             if (node.right != null) stack.add(node.right);             if (node.left != null) stack.add(node.left);         }         return result;     } } 
Python

递归

class Solution:     def sumOfLeftLeaves(self, root: TreeNode) -> int:         if not root:              return 0                  left_left_leaves_sum = self.sumOfLeftLeaves(root.left)  # 左         right_left_leaves_sum = self.sumOfLeftLeaves(root.right) # 右                  cur_left_leaf_val = 0         if root.left and not root.left.left and not root.left.right:              cur_left_leaf_val = root.left.val  # 中                      return cur_left_leaf_val + left_left_leaves_sum + right_left_leaves_sum 

迭代

class Solution:     def sumOfLeftLeaves(self, root: TreeNode) -> int:         """         Idea: Each time check current node's left node.                If current node don't have one, skip it.          """         stack = []         if root:              stack.append(root)         res = 0                  while stack:              # 每次都把现在节点的左节点添进往.              cur_node = stack.pop()             if cur_node.left and not cur_node.left.left and not cur_node.left.right:                  res += cur_node.left.val                              if cur_node.left:                  stack.append(cur_node.left)             if cur_node.right:                  stack.append(cur_node.right)                          return res 

鸿蒙官方战略配相符共建——HarmonyOS技术社区注册账号送55元