LeetCode 110.平衡二叉树
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。
但leetcode中强调的深度和高度很明显是按照结点来计算的,如图:
因为求深度可以从上往下遍历,所以需要前序遍历(中左右),而高度只能从下向上遍历,所以只能用后序遍历(左右中)。
有的同学一定疑惑,为什么104.二叉树的最大深度 (opens new window)中求的是二叉树的最大深度,也用的是后序遍历。
那是因为代码的逻辑其实是求的根节点的高度,而根节点的高度就是这棵树的最大深度,所以才可以使用后序遍历。
思路:标记左右子树高度差超过1的结点直接返回-1,不需要再继续进行下去。代码如下:
class Solution {
public boolean isBalanced(TreeNode root) {
if(root == null) return true;
int height = getDepth(root);
if(height == -1) return false;
return true;
}
public int getDepth(TreeNode node){
if(node == null) return 0;
int leftDepth = getDepth(node.left); // 左
if(leftDepth == -1) return -1;
int rightDepth = getDepth(node.right); // 右
if(rightDepth == -1) return -1;
int sub = leftDepth - rightDepth; // 中
if(sub < -1 || sub > 1) return -1;
return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
}
}
LeetCode 257. 二叉树的所有路径
思路:求根节点到叶子结点的路径,需要用前序遍历,方便让父节点指向子节点,找到对应的路径。要把路径记下来,需要回溯来回退一步路径再进入下一个路径。
代码如下:
class Solution {
List<String> result = new ArrayList<String>();
public List<String> binaryTreePaths(TreeNode root) {
String path = "";
tranversal(root,path);
return result;
}
public void tranversal(TreeNode node, String s) {
if(node == null) return;
if(node.left == null && node.right == null) {
result.add(new StringBuilder(s).append(node.val).toString());
return;
}
String temp = new StringBuilder(s).append(node.val).append("->").toString();
tranversal(node.left, temp);
tranversal(node.right, temp);
}
}
LeetCode 404.左叶子之和
本题也是简单的二叉树的遍历问题,主要把握住左叶子的定义即可,即当前根节点不为空,且左子树的左右子树为空,则说明当前节点的左子树为一个左叶子,代码如下:
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
return transval(root);
}
public int transval(TreeNode node){
if(node == null) return 0;
int leftValue = 0;
if(node.left != null && node.left.left == null && node.left.right == null){
leftValue = node.left.val;
}
return leftValue + transval(node.left) + transval(node.right);
}
}