计算给定二叉树的所有左叶子之和。
示例:
3
/ \
9 20
/ \
15 7
在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
思路
主要的思路就是对给定的二叉树做DFS,为了找到左叶子,我这里设置了一个新类Node
来记录当前结点的身份(是父结点的左孩子还是右孩子)。
如果lchild
置1
,则说明该结点是父结点的左孩子;如果rchild
置1
,则说明该结点是父结点的右孩子。而根结点的lchild
和rchild
都置0
。
然后的话这题就很好做了,DFS搜索的边界就是找到既是叶子结点
且又是左孩子
的结点,将它们的val
值进行累加即可。
代码
public class Solution {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
class Node{
TreeNode node;
int lchild;//记录当前结点的身份,如果是父亲的左孩子,则置1,以下同理
int rchild;
Node(TreeNode node, int lchild, int rchild){
this.node = node;
this.lchild = lchild;
this.rchild = rchild;
}
}
int sum = 0;
public void dfs(Node root) {
if(root.node.left==null&&root.node.right==null&&root.lchild==1) {
sum += root.node.val;
}
if(root.node.left!=null) {
Node leftChild = new Node(root.node.left, 1, 0);
dfs(leftChild);
}
if(root.node.right!=null) {
Node rightChild = new Node(root.node.right, 0, 1);
dfs(rightChild);
}
}
public int sumOfLeftLeaves(TreeNode root) {
if(root!=null) {
Node rootNode = new Node(root, 0, 0);
dfs(rootNode);
}
return sum;
}
}