110.平衡二叉树
完成
代码
迭代法,求每个节点左右子树的高度。
效率较低,因为会重复遍历节点
class Solution {
public int getHeight(TreeNode root){
if(root == null) return 0;
return Math.max(getHeight(root.left), getHeight(root.right))+1;
}
public boolean isBalanced(TreeNode root) {
if(root == null) return true;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.empty()){
TreeNode node = stack.pop();
int left = getHeight(node.left);
int right = getHeight(node.right);
if(Math.abs(left-right)>1) return false;
if(node.left!=null) stack.add(node.left);
if(node.right!=null) stack.add(node.right);
}
return true;
}
}
递归法,递归时判断子树是否为平衡二叉树
class Solution {
public int getHeight(TreeNode root){
if(root == null) return 0;
int leftHeight = getHeight(root.left);
// 如果左子树不是平衡二叉树,直接return -1
if(leftHeight==-1) return -1;
int rightHeight = getHeight(root.right);
// 如果右子树不是平衡二叉树,直接return -1
if(rightHeight==-1) return -1;
// 先判断是否为平衡二叉树
return Math.abs(leftHeight-rightHeight)>1?-1:Math.max(leftHeight,rightHeight)+1;
}
public boolean isBalanced(TreeNode root) {
return getHeight(root)!=-1;
}
}
257. 二叉树的所有路径
完成
代码
List<String> result = new ArrayList<>();
public List<String> binaryTreePaths(TreeNode root) {
deal(root, "");
return result;
}
public void deal(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 tmp = new StringBuilder(s).append(node.val).append("->").toString();
deal(node.left, tmp);
deal(node.right, tmp);
}
404.左叶子之和
完成
递归遍历
代码
class Solution {
public int sum = 0;
public void preorder(TreeNode root){
if(root == null) return;
// 是左节点,并且是叶子节点
if(root.left != null&& root.left.left==null&&root.left.right==null) sum+=root.left.val;
preorder(root.left);
preorder(root.right);
}
public int sumOfLeftLeaves(TreeNode root) {
sum = 0;
preorder(root);
return sum;
}
}