语言
Java
110.平衡二叉树
题目
给定一个二叉树,判断它是否是 平衡二叉树
思路
构造一个方法,递归获取二叉树的高度。终止条件:节点为空,参数:根节点,单层递归:
先判断节点是否为空为空返回0,采用后序遍历,左右中的方式,递归左右子树,判断如果左右子树是否不平衡。返回左右高度的最大值 + 1 ,因为高度从0开始。
代码
class Solution {
public boolean isBalanced(TreeNode root) {
return getHeight(root) != -1;
}
public int getHeight(TreeNode root) {
if (root == null) {//从根节点开始计算高度
return 0;//也是递归终止条件
}
int leftHeight = getHeight(root.left);
if (leftHeight == -1) {
return -1;
}
int rightHeight = getHeight(root.right);
if (rightHeight == -1) {
return -1;
}
if (Math.abs(leftHeight - rightHeight) > 1) {
return -1;
}
return Math.max(leftHeight, rightHeight) + 1;
}
}
易错点
需要判断左右高度是否为-1,这是判断左右节点是否平衡。
257. 二叉树的所有路径
题目
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
思路
采用前序遍历,递归加回溯的方式,先创建一个字符串数组用来收集结果。判断根节点是否为空,为空的话直接返回空数组。再创建一个整形数组用来存储路径。创建一个方法进行递归。
终止条件:树的左右子树为空。参数:根节点,路径,结果数组。
单层递归:先把节点数组加到路径数组中,判断左右子节树是否都为空,为空输出路径。
再判断左子树是否为空进行递归和回溯,右子树同理。
具体细节看代码。
代码
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> res = new ArrayList<String>();//创建结果数组
if (root == null) {//判断根节点是否为空
return res;
}
List<Integer> paths = new ArrayList<Integer>();//创建一个字符串存储路径
load(root, paths, res);
return res;
}
public void load(TreeNode root, List<Integer> paths, List<String> res) {
paths.add(root.val);//前序遍历的中
if (root.left == null && root.right == null) {
StringBuilder sb = new StringBuilder();//创建一个可变字符串
for (int i = 0; i < paths.size() - 1; i++) {
sb.append(paths.get(i)).append("->");//将路径变为字符串
}
sb.append(paths.get(paths.size() - 1 ));
res.add(sb.toString());
}
if (root.left != null) {//左
load(root.left, paths, res);
paths.remove(paths.size() - 1);//回溯
}
if (root.right != null) {//右
load(root.right, paths, res);
paths.remove(paths.size() - 1);//回溯
}
}
}
易错点
先进行前序遍历的中,添加数组的值。不是在输出之后。否则会少添加叶子节点。
注意理解左右子树的回溯过程。
404.左叶子之和
题目
给定二叉树的根节点 root
,返回所有左叶子之和。
思路
采用后序遍历的方法,递归。
终止条件:左叶子的下面左右是否为空。参数:节点
单层递归:向左递归存值,向右递归存值,最后进行判断是否是左叶子,如果是存值。
具体细节看代码
代码
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) {//终止条件
return 0;
}
int leftValue = sumOfLeftLeaves(root.left);//后序遍历左
int rightValue = sumOfLeftLeaves(root.right);//后序遍历右
int midValue = 0;
if (root.left != null && root.left.left == null && root.left.right == null) {
midValue = root.left.val;//后序遍历中
}
int sum = leftValue + rightValue + midValue;
return sum;
}
}
易错点
注意判断条件,左节点不为空,左节点的的子树为空。
222.完全二叉树的节点个数
题目
给你一棵 完全二叉树 的根节点 root
,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h
层,则该层包含 1~ 2h
个节点。
思路
题目给了直接是个完全二叉树,直接左右中遍历。
代码
class Solution {
public int countNodes(TreeNode root) {
if (root == null) return 0;
int leftNum = countNodes(root.left);//左
int rightNum = countNodes(root.right);//右
int sum = leftNum + rightNum;//中
return sum + 1;
}
}
易错点
这道题基本没有易错点。