二叉树查询最深的叶子节点和
对于一课二叉树,要求得到所有最深深度的叶子节点的和。
题目很简单,它其实是求二叉树所有叶子节点的和的一个小变种。
先看看如果要求所有叶子节点的和:
int res = 0;
public int leafTotal(TreeNode root) {
search(root);
return res;
}
public void search(TreeNode root) {
if (root == null) return;
if (root.right == null && root.left == null) {
res += root.val;
}
if (root.left != null) {
search(root.left);
}
if (root.right != null) {
search(root.right);
}
}
非常常规的二叉树递归遍历框架。只要判断二叉树是否为叶子节点,是的话在结果中加上叶子节点的值即可。
那么题目所说的最深深度怎么办呢?
很简单,在递归的参数列表中,额外保存一下当前递归的深度即可。
int maxDep = 0;
int total = 0;
public int deepestLeavesSum(TreeNode root) {
if (root == null) return total;
search(root, 1);
return total;
}
private void search(TreeNode root, int deep) {
if (root.left != null) {
search(root.left, deep + 1);
}
if (root.right != null) {
search(root.right, deep + 1);
}
if (deep == maxDep) {
total += root.val;
return;
}
if (deep < maxDep) {
return;
}
maxDep = deep;
total = root.val;
}
我们只需要判断当前节点的深度是否大于保存着的最大深度,如果等于,则在结果中加上节点值,如果小于,说明这个节点不是我们想要的。如果大于,则说明第一次发现了更深的节点,那么以前查询的结果因该被舍弃,这个节点的深度成为最大深度。
非叶子节点不需要将它单独拎出来判断一下,因为它的子节点一定比它深,它的值一定不会被用到的。
以上两个方法的时间复杂度O(N) 取决于叶子节点的个数,空间复杂度则是最大递归栈深度决定的,即二叉树的高度,这个怎么表达啊??咱也不是很清楚。
- 0
- 0
-
分享