一,题目大意
给出一个二叉树,求出这个二叉树所有左叶子节点的和。
二、分析:这是一道二叉树的题目,对于二叉树的问题,很多都可以用遍历的思想解决。
1,二叉树DFS遍历(递归,非递归),在我的另一篇里有详细的介绍。
2,二叉树BFS遍历,本文主要介绍的类容。
3,利用遍历的思想解决这个问题。
4,如何判断一个节点是左叶子节点(解决这个问题的核心):对于一个节点root,root.left不为空,且 root.left.letf、root.left.right为空,则root.left这个节点是左叶子节点。
三,DFS解决:
1,DFS的介绍:具体介绍在另一篇文章里面:
2,解决这个问题:
public static int sumOfLeftLeaves(TreeNode root) {
int sum = 0;
Stack<TreeNode> stack = new Stack<TreeNode>();//实现遍历
while(root != null || !stack.isEmpty()) {
while (root != null) {
stack.push(root);
root = root.left;
}
if(!stack.isEmpty()) {
root = stack.pop();
if(root.left != null && root.left.left == null && root.left.right == null) {//左节点的判断
sum += root.left.n;//把左节点加起来
}
root = root.right;
}
}
return sum;
}
四,BFS解决
1,BFS遍历:利用队列,先把根节点放入队列;从队列取一个节点root访问,把root.left,root.right放入队列;直到队列为空。以打印为例:
public static void printDFS(TreeNode root) {
Queue<TreeNode> queue = new ArrayBlockingQueue<TreeNode>(20);//对列
if(root != null) {
queue.add(root);//放入根节点
}
while(!queue.isEmpty()) {
root = queue.remove();//从队列节点取
System.out.print(root.n + " ");//访问操作
if(root.left != null)//放入左孩子
queue.add(root.left);
if(root.right != null)//放入右孩子
queue.add(root.right);
}
}
2,解决这个问题:
public static int sumOfLeftLeaves(TreeNode root) {
int sum = 0;
Queue<TreeNode> queue = new ArrayBlockingQueue<TreeNode>(20);
if(root != null) {
queue.add(root);
}
while(!queue.isEmpty()) {
root = queue.remove();
if(root.left != null && root.left.left == null && root.left.right == null) {//改变了访问节点的操作
sum += root.left.n;
}
if(root.left != null)
queue.add(root.left);
if(root.right != null)
queue.add(root.right);
}
return sum;
}
五,递归解决这个问题
public static int sumOfLeftLeaves3(TreeNode root) {
if(root==null)
return 0;
else if(root.left!=null && root.left.left==null && root.left.right==null)
return root.left.n+sumOfLeftLeaves(root.right);
else
return sumOfLeftLeaves(root.left)+sumOfLeftLeaves(root.right);
}