404. 左叶子之和
题目
给定二叉树的根节点 root
,返回所有左叶子之和。
答案
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
int res = 0;
if(root==null){
return res;
}
Queue<TreeNode> queue = new LinkedList();
queue.offer(root);
while(!queue.isEmpty()){
int size = queue.size();
for(int i=0;i<size;i++){
TreeNode curr = queue.poll();
if(curr.left!=null){
queue.offer(curr.left);
//加入左节点时,判断是否为左叶子
if(curr.left.left==null && curr.left.right==null){
res += curr.left.val;
}
}
if(curr.right!=null) queue.offer(curr.right);
}
}
return res;
}
}
513. 找树左下角的值
题目
给定一个二叉树的 根节点 root
,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
答案
class Solution {
public int findBottomLeftValue(TreeNode root) {
int res = 0;
if(root==null){
return res;
}
Queue<TreeNode> queue = new LinkedList();
queue.offer(root);
while(!queue.isEmpty()){
int size = queue.size();
for(int i=0;i<size;i++){
TreeNode curr = queue.poll();
//每一层的第一个
if(i==0) res = curr.val;
if(curr.left!=null) queue.offer(curr.left);
if(curr.right!=null) queue.offer(curr.right);
}
}
return res;
}
}
112. 路径总和
题目
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
答案
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root==null){
return false;
}
//根 左 右
if(root.left==null && root.right==null && targetSum==root.val){
return true;
}
boolean left = hasPathSum(root.left,targetSum-root.val);
boolean right = hasPathSum(root.right,targetSum-root.val);
return left || right;
}
}
113. 路径总和 II
题目
给你二叉树的根节点 root
和一个整数目标和 targetSum
,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
答案
class Solution {
List<List<Integer>> res = new ArrayList();
List<Integer> list = new LinkedList();
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
deal(root,targetSum);
return res;
}
void deal(TreeNode root,int targetSum){
if(root==null){
return;
}
//根 左 右
list.add(root.val);
if(root.left==null && root.right==null && root.val==targetSum){
res.add(new ArrayList(list));
}
deal(root.left,targetSum-root.val);
deal(root.right,targetSum-root.val);
list.removeLast();
}
}
105. 从前序与中序遍历序列构造二叉树
题目
给定两个整数数组 preorder
和 inorder
,其中 preorder
是二叉树的先序遍历, inorder
是同一棵树的中序遍历,请构造二叉树并返回其根节点。
答案
class Solution {
Map<Integer,Integer> map;
public TreeNode buildTree(int[] preorder, int[] inorder) {
map = new HashMap();
for(int i=0;i<inorder.length;i++){
map.put(inorder[i],i);
}
return deal(inorder,0,inorder.length,preorder,0,preorder.length);
}
TreeNode deal(int[] inorder,int inBegin,int inEnd,int[] preorder,int preBegin,int preEnd){
if(inBegin>=inEnd || preBegin>=preEnd){
return null;
}
int rootVal = preorder[preBegin];
int rootIndex = map.get(rootVal);
int leftLen = rootIndex - inBegin;
// 根 左 右
TreeNode root = new TreeNode(rootVal);
root.left = deal(inorder,inBegin,inBegin+leftLen,preorder,preBegin+1,preBegin+1+leftLen);
root.right = deal(inorder,rootIndex+1,inEnd,preorder,preBegin+1+leftLen,preEnd);
return root;
}
}
106. 从中序与后序遍历序列构造二叉树
题目
给定两个整数数组 inorder
和 postorder
,其中 inorder
是二叉树的中序遍历, postorder
是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
答案
class Solution {
Map<Integer,Integer> map;
public TreeNode buildTree(int[] inorder, int[] postorder) {
map = new HashMap();
for(int i=0;i<inorder.length;i++){
map.put(inorder[i],i);
}
return deal(inorder,0,inorder.length,postorder,0,postorder.length);
}
TreeNode deal(int[] inorder,int inBegin,int inEnd,int[] postorder,int postBegin,int postEnd){
if(inBegin>=inEnd || postBegin>=postEnd){
return null;
}
int rootVal = postorder[postEnd-1];
int rootIndex = map.get(rootVal);
int leftLen = rootIndex - inBegin;
//根 左 右
TreeNode root = new TreeNode(rootVal);
root.left = deal(inorder,inBegin,rootIndex,postorder,postBegin,postBegin+leftLen);
root.right = deal(inorder,rootIndex+1,inEnd,postorder,postBegin+leftLen,postEnd-1);
return root;
}
}
654. 最大二叉树
题目
给定一个不重复的整数数组 nums
。 最大二叉树 可以用下面的算法从 nums
递归地构建:
- 创建一个根节点,其值为
nums
中的最大值。 - 递归地在最大值 左边 的 子数组前缀上 构建左子树。
- 递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums
构建的 *最大二叉树* 。
答案
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return deal(nums,0,nums.length);
}
TreeNode deal(int[] nums,int begin,int end){
if(end-begin<1){
return null;
}
if(end-begin==1){
return new TreeNode(nums[begin]);
}
int maxVal = nums[begin];
int maxIndex = begin;
for(int i=begin+1;i<end;i++){
if(nums[i]>maxVal){
maxVal = nums[i];
maxIndex = i;
}
}
// 根 左 右
TreeNode root = new TreeNode(maxVal);
root.left = deal(nums,begin,maxIndex);
root.right = deal(nums,maxIndex+1,end);
return root;
}
}
617. 合并二叉树
题目
给你两棵二叉树: root1
和 root2
。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。
答案
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if(root1==null){
return root2;
}
if(root2==null){
return root1;
}
//根 左 右
TreeNode root = new TreeNode(root1.val+root2.val);
root.left = mergeTrees(root1.left,root2.left);
root.right = mergeTrees(root1.right,root2.right);
return root;
}
}