代码随想录刷题boot camp第17天 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和
110.平衡二叉树 题目链接: https://leetcode.cn/problems/balanced-binary-tree/
这道题比较经典,判断一棵树是否是平衡二叉树就是判断他的左右子树高度差为不为大于1,如果小于等于1则该树为平衡二叉树,反之则不是,求二叉树高度我们可以用到后序遍历参考
我们可以巧妙地用求高度的递归函数来做这道题
class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null) return true;
if (getHeight(root) != -1) return true;
return false;
}
private int getHeight(TreeNode node) {
if (node == null) return 0;
int left = getHeight(node.left);
if (left == -1) return -1;
int right = getHeight(node.right);
if (right == -1) return -1;
if (Math.abs(left - right) > 1) return -1;
return Math.max(left, right) + 1;
}
}
心得:递归三部曲先确定base case的终止条件,如果当前节点为null则返回高度为0,之后开始第二部确定单层递归逻辑,就是收集左子树和右子树的高度,如果其中一棵子树返回值为-1则说明这棵树不可能为平衡二叉树,可以立即返回-1,收集完左右子树高度以后,做逻辑判断,如果高度差大于1则返回-1说明这棵树不是平衡二叉树,这个函数返回的是高度,返回逻辑和最大高度一样。
257. 二叉树的所有路径 题目链接: https://leetcode.cn/problems/binary-tree-paths/
心得:如果掌握了回溯这道题也不难,先确定base case,如果到了叶子结点,要做的步骤就是加上叶子结点然后加入数组,写好basecase以后开始写单层递归逻辑,如果左右不为空开始递归,递归回来记得pop掉递归下去的节点,pop的方法我写的有点丑陋了,能ac就行
class Solution {
StringBuilder sb = new StringBuilder();
List<String> result = new LinkedList<String>();
public List<String> binaryTreePaths(TreeNode root) {
if (root == null) return result;
dfs(root, sb);
return result;
}
private void dfs(TreeNode node, StringBuilder sb) {
sb.append(node.val);
if (node.left == null && node.right == null) {
result.add(sb.toString());
return;
}
if (node.left != null) {
sb.append("->");
dfs(node.left, sb);
pop(sb);
}
if (node.right != null) {
sb.append("->");
dfs(node.right, sb);
pop(sb);
}
return;
}
private void pop (StringBuilder sb) {
while (sb.charAt(sb.length()-1) != '>') {
sb.deleteCharAt(sb.length() - 1);
}
sb.deleteCharAt(sb.length() - 1);
sb.deleteCharAt(sb.length() - 1);
}
}
404.左叶子之和 题目链接: https://leetcode.cn/problems/sum-of-left-leaves/
心得:递归三部曲老样子,写好base case,如果root是null 返回0,第二步写不写也可以,然后确认如过左边只有一个叶子结点那就返回这个节点的值和右子树递归的值,不然递归左右后返回递归的值之和。。。。。222.完全二叉树的节点个数和这道题有点像,logic wise
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) return 0;
if (root.left == null && root.right == null) return 0;
if (root.left != null && root.left.left == null && root.left.right == null) {
return root.left.val + sumOfLeftLeaves(root.right);
}
int left = sumOfLeftLeaves(root.left);
int right = sumOfLeftLeaves(root.right);
return left + right;
}
}