110.平衡二叉树
题目链接:力扣题目链接
思路:最开始思路是迭代传入两个参一个是节点一个是boolean,boolean是true,平衡二叉树不是左右高度要大于一才不属于,如果第一次有高度差boolean修改成false,之后再判断。但是发现只能解决一部分情况不能完全解决高度差大于一。查看题解:递归后续遍历,参数:当前传入节点。 返回值:以当前传入节点为根节点的树的高度。递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0,分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。
class Solution {
public boolean isBalanced(TreeNode root) {
return height(root) != -1;
}
private int height(TreeNode node) {
if (node == null) {
return 0;
}
int leftHeight = height(node.left);
if (leftHeight == -1) return -1; // 左子树不平衡
int rightHeight = height(node.right);
if (rightHeight == -1) return -1; // 右子树不平衡
if (Math.abs(leftHeight - rightHeight) > 1) {
return -1; // 当前节点不平衡
}
return Math.max(leftHeight, rightHeight) + 1; // 返回树的高度
}
}
257. 二叉树的所有路径
题目链接:力扣题目链接
思路:确定递归函数的参数和返回值:参数就是节点和存储从根节点到当前节点直前的列表,中String的列表。确定终止条件:遇到左右都为空就生成String就加入列表返回。确定单层递归的逻辑:先在节点列表加入当前节点的值(不为空情况),检查左右是否为空,左帝国,右递归,列表减去当前节点准备回溯。
404.左叶子之和
题目链接:力扣题目链接
思路:因为是求左子叶之和,所以条件肯定不能是左子节点,这个左子节点还要其左右子节点为null。用后续遍历先左子叶遍历求和右子叶只是遍历不求和,最后中间节点是左右子叶之和。
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
return die(root);
}
public int die(TreeNode node){
int sum = 0;
if(node==null){
return 0;
}
if(node.left!=null){
if(node.left.left==null && node.left.right == null){
sum += node.left.val;
}else{
sum += die(node.left);
}
}
sum += die(node.right);
return sum;
}
}
222.完全二叉树的节点个数
题目链接:力扣题目链接
思路:后序遍历递归即可。
题解:因为是完全二叉树,可以递归节点左右子树判断深度,如果深度一致则数量就是2^深度-1,否则就分别进入左右子节点然后继续递归节点左右子树判断深度。
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;
}
}
时间:2.5h