226. 翻转二叉树
题目
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
答案
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root==null){
return root;
}
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();
swap(curr);//只能传 curr 值传递
if(curr.left!=null) queue.offer(curr.left);
if(curr.right!=null) queue.offer(curr.right);
}
}
return root;
}
void swap(TreeNode root){
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
}
101. 对称二叉树
题目
给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
答案
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null){
return true;
}
Queue<TreeNode> queue = new LinkedList();
queue.offer(root.left);
queue.offer(root.right);
while(!queue.isEmpty()){
int size = queue.size();
for(int i=0;i<size;i++){
TreeNode left = queue.poll();
TreeNode right = queue.poll();
if(left==null && right==null){
continue;
}
if(left==null || right==null || left.val!=right.val){
return false;
}
queue.offer(left.left);//null 也放进去
queue.offer(right.right);
queue.offer(left.right);
queue.offer(right.left);
}
}
return true;
}
}
104. 二叉树的最大深度
题目
给定一个二叉树 root
,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:3
答案
class Solution {
public int maxDepth(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();
res++;
for(int i=0;i<size;i++){
TreeNode curr = queue.poll();
if(curr.left!=null) queue.offer(curr.left);
if(curr.right!=null) queue.offer(curr.right);
}
}
return res;
}
}
111. 二叉树的最小深度
题目
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
**说明:**叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:2
答案
class Solution {
public int minDepth(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();
res++;
for(int i=0;i<size;i++){
TreeNode curr = queue.poll();
if(curr.left==null && curr.right==null){
return res;
}
if(curr.left!=null) queue.offer(curr.left);
if(curr.right!=null) queue.offer(curr.right);
}
}
return res;
}
}
222. 完全二叉树的节点个数
题目
给你一棵 完全二叉树 的根节点 root
,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h
层,则该层包含 1~ 2h
个节点。
示例 1:
输入:root = [1,2,3,4,5,6]
输出:6
答案
class Solution {
public int countNodes(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();
res++;
if(curr.left!=null) queue.offer(curr.left);
if(curr.right!=null) queue.offer(curr.right);
}
}
return res;
}
}
110. 平衡二叉树
题目
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:true
答案
class Solution {
public boolean isBalanced(TreeNode root) {
if(root==null){
return true;
}
return Math.abs(deal(root.left)-deal(root.right))<2 //根 左 右
&& isBalanced(root.left)
&& isBalanced(root.right);
}
int deal(TreeNode root){
if(root==null){
return 0;
}
return Math.max(deal(root.left),deal(root.right)) + 1;
}
}
257. 二叉树的所有路径
题目
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]
答案
class Solution {
List<String> res = new ArrayList();
public List<String> binaryTreePaths(TreeNode root) {
if(root==null){
return res;
}
deal(root,"");
return res;
}
void deal(TreeNode root,String str){
if(root==null){
return;
}
if(root.left==null && root.right==null){
res.add(new StringBuilder(str).append(root.val+"").toString());
return;
}
str = new StringBuilder(str).append(root.val+"").append("->").toString();//根 左 右
deal(root.left,str);
deal(root.right,str);
}
}
404. 左叶子之和
题目
给定二叉树的根节点 root
,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
答案
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
,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
示例 1:
输入: root = [2,1,3]
输出: 1
答案
class Solution {
public int findBottomLeftValue(TreeNode root) {
int res = 0;
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
。
叶子节点 是指没有子节点的节点。
示例 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;
}
if(root.left==null && root.right==null){//根 左 右
return targetSum==root.val;
}
return hasPathSum(root.left,targetSum-root.val) || hasPathSum(root.right,targetSum-root.val);
}
}
105. 从前序与中序遍历序列构造二叉树
题目
给定两个整数数组 preorder
和 inorder
,其中 preorder
是二叉树的先序遍历, inorder
是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例 1:
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
答案
class Solution {
Map<Integer,Integer> map = new HashMap();
public TreeNode buildTree(int[] preorder, int[] inorder) {
for(int i=0;i<inorder.length;i++){
map.put(inorder[i],i);
}
TreeNode res = deal(preorder,0,preorder.length,inorder,0,inorder.length);
return res;
}
TreeNode deal(int[] preorder,int preBegin,int preEnd,int[] inorder,int inBegin,int inEnd){
if(preBegin>=preEnd || inBegin>=inEnd){
return null;
}
int currIndex = map.get(preorder[preBegin]);//根左右
int leftLen = currIndex - inBegin;
TreeNode curr = new TreeNode(preorder[preBegin]);
curr.left = deal(preorder,preBegin+1,preBegin+1+leftLen,inorder,inBegin,inBegin+leftLen);
curr.right = deal(preorder,preBegin+1+leftLen,preEnd,inorder,currIndex+1,inEnd);
return curr;
}
}
106. 从中序与后序遍历序列构造二叉树
题目
给定两个整数数组 inorder
和 postorder
,其中 inorder
是二叉树的中序遍历, postorder
是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
示例 1:
输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]
答案
class Solution {
Map<Integer,Integer> map = new HashMap();
public TreeNode buildTree(int[] inorder, int[] postorder) {
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 currIndex = map.get(postorder[postEnd-1]);
int leftLen = currIndex - inBegin;
TreeNode curr = new TreeNode(postorder[postEnd-1]);
curr.left = deal(inorder,inBegin,currIndex,postorder,postBegin,postBegin+leftLen);
curr.right = deal(inorder,currIndex+1,inEnd,postorder,postBegin+leftLen,postEnd-1);//postEnd-1根节点
return curr;
}
}
654. 最大二叉树
题目
给定一个不重复的整数数组 nums
。 最大二叉树 可以用下面的算法从 nums
递归地构建:
- 创建一个根节点,其值为
nums
中的最大值。 - 递归地在最大值 左边 的 子数组前缀上 构建左子树。
- 递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums
构建的 *最大二叉树* 。
示例 1:
输入:nums = [3,2,1,6,0,5]
输出:[6,3,5,null,2,0,null,null,1]
答案
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 maxIndex = begin;
int maxIndexVal = nums[begin];
for(int i=begin+1;i<end;i++){
if(nums[i]>maxIndexVal){
maxIndex = i;
maxIndexVal = nums[i];
}
}
TreeNode curr = new TreeNode(maxIndexVal);//根 左 右 构建树
curr.left = deal(nums,begin,maxIndex);
curr.right = deal(nums,maxIndex+1,end);
return curr;
}
}
617. 合并二叉树
题目
给你两棵二叉树: root1
和 root2
。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。
示例 1:
输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
输出:[3,4,5,5,4,null,7]
答案
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if(root1==null){
return root2;
}
if(root2==null){
return root1;
}
TreeNode curr = new TreeNode(root1.val+root2.val);
curr.left = mergeTrees(root1.left,root2.left);
curr.right = mergeTrees(root1.right,root2.right);
return curr;
}
}