LC: 404.左叶子节点
计算给定二叉树的所有左叶子之和。
示例:
/ \
9 20
/ \
15 7
,所以返回 24
解析
我们需要找到这样的节点
属于叶子节点
属于父节点的左子节点
方法一:用栈,dfs遍历,用全局变量res作为累积和。遍历的过程中传递该节点是否是左子节点。同时判断左右子节点是否为None,则可以知道是不是左叶子节点。
class Solution:
def sumOfLeftLeaves(self, root: TreeNode) -> int:
stack = []
res = 0
if not root:
return res
stack.append((root, 0))
while len(stack) != 0:
p, flag = stack.pop()
if flag == 1:
if p.left == p.right == None:
res += p.val
if p.right:
stack.append((p.right, 0))
if p.left:
stack.append((p.left, 1))
return res
方法二,用递归遍历。遍历到左叶子节点则加上左叶子节点的值。
class Solution:
def sumOfLeftLeaves(self, root: TreeNode) -> int:
self.res = 0
def walk(p):
if p:
if p.left:
if p.left.left == p.left.right == None:
self.res += p.left.val
walk(p.left)
if p.right:
walk(p.right)
walk(root)
return self.res
方法三, 仍是递归,没有使用全局变量。而是使用在递归函数内部累积的方式(即有返回值)。遍历到左叶子节点,则返回值就在此基础上加上右节点的遍历。
class Solution:
def sumOfLeftLeaves(self, root: TreeNode) -> int:
if root == None:
return 0
res = 0
if root.left:
if root.left.left == root.left.right == None:
res += root.left.val
return res + self.sumOfLeftLeaves(root.left) + self.sumOfLeftLeaves(root.right)
方法四,在外汇返佣的过程中,用一个形参记录该节点是否为左孩子点。和用stack遍历类似。
class Solution:
def sumOfLeftLeaves(self, root: TreeNode) -> int:
def cal(p, dir):
if not p:
return 0
if p.left == p.right == None:
if dir == 1:
return p.val
else:
pass
return cal(p.left, 1) + cal(p.right, 0)
return cal(root, 0)
方法五,当然还能用bfs遍历,遍历到左叶子节点就加上去。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if (!root)
return 0;
if (root->left && !root->left->left && !root->left->right) {
return root->left->val + sumOfLeftLeaves(root->right);
}
return sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);
}
};
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
class Solution {
public int getLeafCount(TreeNode root) {
if (root == null) {
return 0;
}
if (root.left == null && root.right == null) {
// 输出叶子节点
System.out.println("leaf nodes:" + root.val);
return 1;
}
return getLeafCount(root.left) + getLeafCount(root.right);
}
}
public class Test {
public static void main(String[] args) {
Solution tree = new Solution();
/* create a tree */
TreeNode root = new TreeNode(3);
root.left = new TreeNode(9);
root.right = new TreeNode(20);
root.right.left = new TreeNode(15);
root.right.right = new TreeNode(7);
System.out.println(tree.getLeafCount(root));
}
}
LC: 404.左叶子节点的更多相关文章
- LeetCode: 404.左叶子节点
计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 解析 我们需要找到这样的节点 属于叶子节点 属于父 ...
- LeetCode 404. 左叶子之和(Sum of Left Leaves)
404. 左叶子之和 404. Sum of Left Leaves LeetCode404. Sum of Left Leaves 题目描述 计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 ...
- 【LeetCode】404. 左叶子之和
404. 左叶子之和 知识点:二叉树 题目描述 计算给定二叉树的所有左叶子之和.. 示例 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 解 ...
- Java实现 LeetCode 404 左叶子之和
404. 左叶子之和 计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 /** * Definiti ...
- [LeetCode]404. 左叶子之和(递归)、938. 二叉搜索树的范围和(递归)(BST)
题目 404. 左叶子之和 如题 题解 类似树的遍历的递归 注意一定要是叶子结点 代码 class Solution { public int sumOfLeftLeaves(TreeNode roo ...
- 左叶子之和(sum-of-left-leaves)
LeetCode题目--左叶子之和(sum-of-left-leaves) 计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 ...
- 404. Sum of Left Leaves 左叶子之和
[抄题]: Find the sum of all left leaves in a given binary tree. Example: 3 / \ 9 20 / \ 15 7 There are ...
- 【原】无脑操作:EasyUI Tree实现左键只选择叶子节点、右键浮动菜单实现增删改
Easyui中的Tree组件使用频率颇高,经常遇到的需求如下: 1.在树形结构上,只有叶子节点才能被选中,其他节点不能被选中: 2.在叶子节点上右键出现浮动菜单实现新增.删除.修改操作: 3.在非叶子 ...
- jquery zTree 查找所有的叶子节点
jquery zTree 查找所有的叶子节点 // 保存所有叶子节点 10 为初始化大小,并非数组上限 var arrayObj = new Array([10]); /* treeNode: 根节点 ...
随机推荐
- 分组函数 partition by 的详解,与order by 区别
partition by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录, partition by ...
- 一张图理解"Figure", "Axes", "Axis"
Figure is the object with the highest level in the hierarchy. It corresponds to the entire graphical ...
- Ubuntu分区小知识与分区方案
Most PC operating systems still work with an ancient disk partition scheme that historically makes d ...
- leetcode-15双周赛-1289-下降路径最小和
题目描述: 方法一:动态规划 O(N^3) class Solution: def minFallingPathSum(self, arr: List[List[int]]) -> int: n ...
- Echarts和Highcharts学习笔记01——入门了解
Echarts是国内百度团队开发的(开源),基于Canvas,适合数据量较大的情况: Highcharts是国外的(商用需授权),基于SVG,方便自己定制,但能使用的图表类型有限: Echarts ...
- mybatis批量生成
使用了mybatis-generator后,寻找只写一个table标签就可以全部生成的方法 下载mybatis-generator-core-1.3.2-bundle.zip 解压后打开docs 发现 ...
- spring boot 修改banner
在resources目录下新建一个banner.txt,里面添加要显示的内容,如: ////////////////////////////////////////////////////////// ...
- nRF51822学习笔记 之 blinky_example
使用的开发板是nRF51822 AK II,爱板网做活动买的. 开发资料可以去这里下载:链接: http://pan.baidu.com/s/1f8pD8 密码: 741y
- Class-DbConnectionManipulator:Execute,QueryFirstDefault<>
ylbtech-Class-DbConnectionManipulator:Execute,QueryFirstDefault<> 1.返回顶部 1. public object GetS ...
- VS2015 编写C++的DLL,并防止DLL导出的函数名出现乱码(以串口通信为例,实现串口通信)
参考链接:https://blog.csdn.net/songyi160/article/details/50754705 1.新建项目 建立好的项目界面如下: 接着在解决方案中找到[头文件]然后右击 ...