当前位置:   article > 正文

代码随想录算法训练营第十七天 | 二叉树 (4)

代码随想录算法训练营第十七天 | 二叉树 (4)

110. 平衡二叉树

思路:

分别计算一个节点的左子树和右子树是否平衡

如果不平衡则直接返回-1,否则向上层继续递归

最后比较根节点的左右子树是否构成平衡

  1. public boolean isBalanced(TreeNode root) {
  2. return getHeight(root) != -1;
  3. }
  4. private int getHeight(TreeNode root){
  5. if (root == null) return 0;
  6. int left = getHeight(root.left);
  7. if (left == -1) return -1;
  8. int right = getHeight(root.right);
  9. if (right == -1) return -1;
  10. if (Math.abs(left - right) > 1) return -1;
  11. return Math.max(left, right) + 1;
  12. }

257. 二叉树的所有路径

使用回溯法的注意事项:

先判断当前节点是否是路径的末尾节点 (通过root.left == null && root.right == null判断)

之后对左右子树递归拓展路径,需要注意递归后需要使用path.remove(path.size() - 1)回溯

  1. public List<String> binaryTreePaths(TreeNode root) {
  2. List<String> res = new ArrayList<>();
  3. if (root == null) return res;
  4. List<Integer> path = new ArrayList<>();
  5. backtracking(root, res, path);
  6. return res;
  7. }
  8. private void backtracking(TreeNode root, List<String> res, List<Integer> path){
  9. path.add(root.val);
  10. if (root.left == null && root.right == null){
  11. res.add(pathToString(path));
  12. return ;
  13. }
  14. if (root.left != null){
  15. backtracking(root.left, res, path);
  16. path.remove(path.size() - 1);
  17. }
  18. if (root.right != null){
  19. backtracking(root.right, res, path);
  20. path.remove(path.size() - 1);
  21. }
  22. }
  23. private String pathToString(List<Integer> path){
  24. StringBuilder sb = new StringBuilder();
  25. for (int n: path) sb.append(n + "->");
  26. return sb.toString().substring(0, sb.length() - 2);
  27. }

404. 左叶子之和

思路:使用一个flag来标记当前节点为左或右节点

当一个节点为叶子并且为左叶子,sum加上当前节点的值

  1. int sum = 0;
  2. public int sumOfLeftLeaves(TreeNode root) {
  3. if (root == null) return 0;
  4. dfs(root, false);
  5. return sum;
  6. }
  7. private void dfs(TreeNode root, boolean isLeft){
  8. if (root == null) return;
  9. if (isLeft && root.left == null && root.right == null) sum += root.val;
  10. dfs(root.left, true);
  11. dfs(root.right, false);
  12. }

另解:使用

root.left != null && root.left.left == null && root.left.right == null

 不断更新左叶子的值

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/694914
推荐阅读
相关标签
  

闽ICP备14008679号