前言
前言
书接上篇文章二叉树习题其一,这篇文章我们将基础拓展
###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!
习题
1.完全二叉树的节点个数
题目链接:222. 完全二叉树的节点个数 - 力扣(LeetCode)
题面:
基本分析:遍历二叉树,遍历的过程中维护一个变量用于统计节点个数
代码:
/**
* Definition for a binary tree node.
* 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 Solution {
int count = 0;
public int countNodes(TreeNode root) {
if(root==null)return 0;
recursion(root);
return count;
}
public void recursion(TreeNode node){
if(node==null)return;
if(node!=null)count++;
recursion(node.left);
recursion(node.right);
}
}
2.平衡二叉树
题目链接:110. 平衡二叉树 - 力扣(LeetCode)
基本分析:判断是否是平衡二叉树就是判断每个‘根节点’的左右子树的高度差是否小于等于1,以此递归下去
代码:
/**
* Definition for a binary tree node.
* 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 Solution {
public boolean isBalanced(TreeNode root) {
return recursion(root)!=-1;
}
public int recursion(TreeNode node){
if(node==null){
return 0;
}
int left = recursion(node.left);
if(left==-1){
return -1;
}
int right = recursion(node.right);
if(right==-1){
return -1;
}
return Math.abs(left-right)>=2?-1:Math.max(left,right)+1;
}
}
3.二叉树的所有路径
题目链接:257. 二叉树的所有路径 - 力扣(LeetCode)
基本分析:同样是遍历二叉树,值得注意的是,拼接箭头最好在递归函数调用的时候,这样可以省去很多麻烦
代码:
/**
* Definition for a binary tree node.
* 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 Solution {
List<String> list = new ArrayList<>();
public List<String> binaryTreePaths(TreeNode root) {
recursion(root,"");
return list;
}
public void recursion(TreeNode node,String pre){
pre+=node.val;
if(node.left!=null) recursion(node.left,pre+"->");
if(node.right!=null) recursion(node.right,pre+"->");
if(node.left==null&&node.right==null){
list.add(pre);
return;
}
}
}
4.左叶子之和
题目链接:404. 左叶子之和 - 力扣(LeetCode)
基本分析:递归函数多维护一个字符串,用于标记该节点是否为左节点,然后就是遍历到最后一个节点进行相加操作
代码:
/**
* Definition for a binary tree node.
* 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 Solution {
int sum = 0;
public int sumOfLeftLeaves(TreeNode root) {
if(root==null||(root.left==null&&root.right==null))return 0;
recursion(root.left,"left");
recursion(root.right,"right");
return sum;
}
public void recursion(TreeNode node,String flag){
if(node==null){
return;
}
if(node.left==null&&node.right==null&&flag.equals("left")){
sum+=node.val;
}
if(node.left!=null){
recursion(node.left,"left");
}
if(node.right!=null){
recursion(node.right,"right");
}
}
}
5.找树左下角的值
题目链接:513. 找树左下角的值 - 力扣(LeetCode)
题面:
基本分析: 这道题要求是找最底层最左边的元素,如果我们调用递归函数是先遍历左节点再遍历右节点,那么一定是先遍历到最底层的左节点,所以只需要判断是不是更低一层即可,然后更改值
代码:
/**
* Definition for a binary tree node.
* 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 Solution {
int ans = 0;
int count = Integer.MIN_VALUE;
public int findBottomLeftValue(TreeNode root) {
ans = root.val;
recursion(root.left,2);
recursion(root.right,2);
return ans;
}
public void recursion(TreeNode node,int u){
if(node==null)return;
if(node.left==null&&node.right==null){
if(u>count){
System.out.println(1);
count = u;
ans = node.val;
}
}
recursion(node.left,u+1);
recursion(node.right,u+1);
}
}
6.路径总和
题面:
基本分析: 遍历,并维护一个值,用来记录到达底部时是否和目标值相同
代码:
/**
* Definition for a binary tree node.
* 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 Solution {
int target =0;
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root==null)return false;
target = targetSum;
return recursion(root,0);
}
public boolean recursion(TreeNode node,int sum){
if(node==null)return false;
sum+=node.val;
if(node.left==null&&node.right==null){
return sum==target;
}
boolean bool1 = recursion(node.left,sum);
boolean bool2 = recursion(node.right,sum);
return bool1||bool2;
}
}
后言
上面是二叉树的部分习题,下一篇会讲解二叉树的其他相关力扣习题,希望有所帮助,一同进步,共勉!