您的位置:首页 > 其它

Sum of Left Leaves

2017-08-19 16:22 225 查看
问题:

Find the sum of all left leaves in a given binary tree.

Example:

3
/ \
9  20
/  \
15   7
There are two left leaves in the binary tree, with values 9 and 15 respectively. Return 24.

解决:

① 递归遍历该树,求得所有左叶节点之和,左叶节点的判断通过一个boolean变量来标识。

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution { //8 ms
public int sumOfLeftLeaves(TreeNode root) {
return getSum(root,false);
}
public int getSum(TreeNode node,boolean isLeft){
if(node == null) return 0;
int sum = 0;
if(node.left != null || node.right != null){
sum += getSum(node.left,true);
sum += getSum(node.right,false);
}else if(isLeft){
sum += node.val;
}
return sum;
}
}

② 使用一个parent节点标识,从而判断子节点是否为左子节点。

public class Solution { //8ms
public int sumOfLeftLeaves(TreeNode root) {
return getSum(root,null);
}
public int getSum(TreeNode node,TreeNode parent){
if(node == null) return 0;
if(node.left == null && node.right == null && parent != null && parent.left == node){
return node.val;
}
int lsum = getSum(node.left,node);
int rsum = getSum(node.right,node);
return lsum + rsum;
}
}

③ 在discuss上看到了使用栈的非递归方法。使用深度优先的方式来遍历节点,并把所有节点放入栈(push)中,之后再取出(pop)即可。

public class Solution{ //12ms
public int sumOfLeftLeaves(TreeNode root) {
if(root == null) return 0;
int sum = 0;
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while(!stack.empty()) {
TreeNode node = stack.pop();
if(node.left != null) {
if (node.left.left == null && node.left.right == null)
sum += node.left.val;
else
stack.push(node.left);
}
if(node.right != null) {
if (node.right.left != null || node.right.right != null)
stack.push(node.right);
}
}
return sum;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: