110. 平衡二叉树
public boolean isBalanced(TreeNode root) {
return getHeight(root) != -1;
}
private 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;
} else {
return Math.max(leftHeight, rightHeight) + 1;
}
}
平衡二叉树的定义是:该树所有节点的左右子树的深度相差不超过 1。
那么意味着,只要保证当前节点的左子树深度和右子树深度不超过1即可。
257. 二叉树的所有路径
/**
* 方式一
*/
private List<List<Integer>> list= new ArrayList();
public List<String> binaryTreePaths(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
getListByTreeNode(root, new LinkedList<>());
return getValue();
}
private List<String> getValue() {
List<String> value = new ArrayList<>();
for(List<Integer> list1 : list) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < list1.size() -1; i++) {
stringBuilder.append(list1.get(i)).append("->");
}
stringBuilder.append(list1.get(list1.size()-1));
value.add(stringBuilder.toString());
}
return value;
}
public void getListByTreeNode(TreeNode root, LinkedList<Integer> value) {
value.add(root.val);
if (root.left == null && root.right == null) { // 根节点,将该数据放入列表中
list.add(new ArrayList<>(value)); // 注意要创建一个新的列表放入其中
return;
}
if (root.left != null) {
getListByTreeNode(root.left, value);
value.removeLast();
}
if (root.right != null) {
getListByTreeNode(root.right, value);
value.removeLast();
}
}
/**
* 方式二
**/
public List<String> binaryTreePaths(TreeNode root) {
List<String> value = new LinkedList<>(); // 最终结果
if (root == null) {
return value;
}
LinkedList<Integer> cur = new LinkedList<>(); //临时节点
getPathByTreeNode(root, value, cur);
return value;
}
private void getPathByTreeNode(TreeNode root, List<String> value, LinkedList<Integer> cur) {
cur.add(root.val);
if (root.right == null && root.left == null) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < cur.size() - 1; i++) {
stringBuilder.append(cur.get(i)).append("->");
}
stringBuilder.append(cur.get(cur.size() - 1));
value.add(String.valueOf(stringBuilder));
}
if (root.left != null) {
getPathByTreeNode(root.left, value, cur);
cur.removeLast();
}
if (root.right != null) {
getPathByTreeNode(root.right, value, cur);
cur.removeLast();
}
}
注意:在递归中要进行回溯,对于左子树和右子树,递归返回之后需要进行回溯
以前我会有这样的疑问,进入递归之后,value的值可能加了N个数,但是这里只移除了一个数,怎么做到回溯的呢?
没有理解到递归就是这样的。对于当前的下层,也是每一层都进行了递归,那么返回到当前层,value列表中,必然只多了一个元素。
相当于,你每次只用关心左节点和右节点,把它认为叶子节点即可。
404. 左叶子之和
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;
}
return midValue + leftValue + rightValue;
}
左数+右数+当前左子树叶子节点数 = 总数。
// 其实有一部分重复了,当已经判断出左节点是叶子节点,那么它的左子树的递归结果就该是0