目录
404.左叶子之和
题目
代码(后序递归)
代码(前序迭代)
513.找树左下角的值
题目
代码(层序迭代)
112.路径总和
题目
代码(前序迭代)
112.路径总和II
题目
代码(前序迭代)
404.左叶子之和
题目
给定二叉树的根节点 root
,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1] 输出: 0
代码(后序递归)
class Solution {public int sumOfLeftLeaves(TreeNode root) {//终止条件if(root == null){return 0;}//单层逻辑int left = sumOfLeftLeaves(root.left);int right = sumOfLeftLeaves(root.right);int mid = 0;if(root.left != null && root.left.left == null && root.left.right == null){mid = root.left.val;}return mid + left + right;}
}
代码(前序迭代)
class Solution {public int sumOfLeftLeaves(TreeNode root) {Stack<TreeNode> stack = new Stack<>();int res = 0;if(root == null){return 0;}stack.push(root);while(!stack.isEmpty()){TreeNode cur = stack.pop();if(cur.right != null){stack.push(cur.right);}if(cur.left != null){stack.push(cur.left);//如果cur有左孩子,且左孩子是叶子if(cur.left.left == null && cur.left.right == null){res += cur.left.val;}}}return res;}
}
513.找树左下角的值
题目
给定一个二叉树的 根节点 root
,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
示例 1:
输入: root = [2,1,3] 输出: 1
代码(层序迭代)
class Solution {public int findBottomLeftValue(TreeNode root) {//其实就是找最后一层的第一个节点Queue<TreeNode> que = new ArrayDeque<>();que.offer(root);int res = 0;while(!que.isEmpty()){int size = que.size();//处理单层节点for(int i=0; i < size; i++){TreeNode cur = que.poll();//下一层节点入队if(cur.left != null){que.offer(cur.left);}if(cur.right != null){que.offer(cur.right);}//是这一层的第一个节点if(i == 0){res = cur.val;}}}return res;}
}
112.路径总和
题目
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22 输出:true 解释:等于目标和的根节点到叶节点路径如上图所示。
代码(前序迭代)
class Solution {public boolean hasPathSum(TreeNode root, int targetSum) {if(root == null){return false;}//前序遍历二叉树Stack<TreeNode> nodestack = new Stack<>();//保留前序遍历到每个节点的路径值Stack<Integer> sumstack = new Stack<>();//保留所有到叶子节点的路径值List<Integer> list = new ArrayList<>();//根节点进栈nodestack.push(root);sumstack.push(root.val);while(!nodestack.isEmpty()){TreeNode cur = nodestack.pop();int sum = sumstack.pop();if(cur.right != null){nodestack.push(cur.right);sumstack.push(sum + cur.right.val);}if(cur.left != null){nodestack.push(cur.left);sumstack.push(sum + cur.left.val);}//cur是叶子节点,把sum加到list路径和集合中if(cur.left == null && cur.right == null){list.add(sum);}}if(list.contains(targetSum)){return true;}else{return false;}}
}
112.路径总和II
题目
给你二叉树的根节点 root
和一个整数目标和 targetSum
,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22 输出:[[5,4,11,2],[5,8,4,5]]
代码(前序迭代)
class Solution {public List<List<Integer>> pathSum(TreeNode root, int targetSum) {//list存放函数最后返回值List<List<Integer>> result = new ArrayList<>();//用于前序迭代遍历二叉树Stack<TreeNode> nodestack = new Stack<>();//记录前序迭代对应的路径和Stack<Integer> sumstack = new Stack<>();//记录前序迭代对应的路径列表Stack<ArrayList<Integer>> pathstack = new Stack<>();if(root == null){return result;}nodestack.push(root);sumstack.push(root.val);//创建根节点对应的path列表ArrayList<Integer> rootpath = new ArrayList<>();rootpath.add(root.val);pathstack.push(rootpath);while(!nodestack.isEmpty()){TreeNode cur = nodestack.pop();int sum = sumstack.pop();ArrayList<Integer> path = pathstack.pop();//如果当前cur是叶子节点,且sum满足,把path加入结果集中if(sum == targetSum && cur.left == null && cur.right == null){result.add(path);}//处理右孩子if(cur.right != null){nodestack.push(cur.right); //右孩子节点入栈sumstack.push(sum + cur.right.val); //新的sum入栈ArrayList<Integer> newpath = new ArrayList<>(path); //创建path的副本newpath.add(cur.right.val); pathstack.push(newpath);}if(cur.left != null){nodestack.push(cur.left);sumstack.push(sum + cur.left.val);ArrayList<Integer> newpath = new ArrayList<>(path);newpath.add(cur.left.val);pathstack.push(newpath);}}return result;}
}