一、110.平衡二叉树
题目链接:https://leetcode.cn/problems/balanced-binary-tree/
文章讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html
视频讲解:https://www.bilibili.com/video/BV1Ug411S7my
1.1 初见思路
- 采用后序遍历:左右中。获取左右节点的高度,然后回到中节点判断左右子树的高度差是否<1
- 求树的高度。
1.2 具体实现
class Solution {
public boolean isBalanced(TreeNode root) {
return getHeight(root)!=-1;
}
int getHeight(TreeNode node){
if(node==null){
return 0;
}
int leftH = getHeight(node.left);
int rightH = getHeight(node.right);
if(leftH==-1 || rightH==-1){
return -1;
}
if(Math.abs(leftH-rightH)<=1){
return Math.max(leftH,rightH)+1;
}else{
return -1;
}
}
}
1.3 重难点
二、 257. 二叉树的所有路径
题目链接:https://leetcode.cn/problems/binary-tree-paths/
文章讲解:https://programmercarl.com/0257.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%89%80%E6%9C%89%E8%B7%AF%E5%BE%84.html
视频讲解:https://www.bilibili.com/video/BV1ZG411G7Dh
2.1 初见思路
- 前序遍历:中左右。中节点先把当前节点值加入到value中,然后判断其左右子节点是否为null,如果为null,说明到了叶子节点,把当前字符串加入到结果集中。不为null,就继续向下进行递归
2.2 具体实现
class Solution {
List<String> list = new ArrayList<String>();
public List<String> binaryTreePaths(TreeNode root) {
String str = "";
getPath(root,str);
return list;
}
void getPath(TreeNode node,String str){
if(node==null){
return;
}
if(node.left==null && node.right==null){
list.add(str+node.val);
}
str+=node.val+"->";
getPath(node.left,str);
getPath(node.right,str);
}
}
2.3 重难点
三、 404.左叶子之和
题目链接:https://leetcode.cn/problems/sum-of-left-leaves/
文章讲解:https://programmercarl.com/0257.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%89%80%E6%9C%89%E8%B7%AF%E5%BE%84.html
视频讲解:https://www.bilibili.com/video/BV1ZG411G7Dh
3.1 初见思路
- 是左叶子节点,不是所有左节点!!
- 前序遍历:中左右。
- 中节点的处理逻辑,取左节点的值加到总和中,
3.2 具体实现
class Solution {
int sum=0;
public int sumOfLeftLeaves(TreeNode root) {
if(root==null){
return sum;
}
getSum(root);
return sum;
}
void getSum(TreeNode node){
if(node==null){
return;
}
if(node.left!=null && node.left.left==null && node.left.right==null){
sum+=node.left.val;
}
getSum(node.left);
getSum(node.right);
}
}
3.3 重难点
四、 222.完全二叉树的节点个数
题目链接:https://leetcode.cn/problems/count-complete-tree-nodes/
文章讲解:https://programmercarl.com/0222.%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8%8A%82%E7%82%B9%E4%B8%AA%E6%95%B0.html
视频讲解:https://www.bilibili.com/video/BV1eW4y1B7pD
4.1 初见思路
- 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2(h) 个节点。
- 使用普通的二叉树来实现,用递归来实现就很简单了
- 如何使用完全二叉树的特性呢?还是得看视频
4.2 具体实现
class Solution {
/**
* 针对完全二叉树的解法
*
* 满二叉树的结点数为:2^depth - 1
*/
public int countNodes(TreeNode root) {
if (root == null) return 0;
TreeNode left = root.left;
TreeNode right = root.right;
int leftDepth = 0, rightDepth = 0; // 这里初始为0是有目的的,为了下面求指数方便
while (left != null) { // 求左子树深度
left = left.left;
leftDepth++;
}
while (right != null) { // 求右子树深度
right = right.right;
rightDepth++;
}
if (leftDepth == rightDepth) {
return (2 << leftDepth) - 1; // 注意(2<<1) 相当于2^2,所以leftDepth初始为0
}
return countNodes(root.left) + countNodes(root.right) + 1;
}
}