当前位置: 首页 > news >正文

算法训练(leetcode)二刷第十三天 | 110. 平衡二叉树、*257. 二叉树的所有路径、404. 左叶子之和、*222. 完全二叉树的节点个数

刷题记录

  • 110. 平衡二叉树
  • *257. 二叉树的所有路径
  • 404. 左叶子之和
    • 思路一:递归法
    • 思路二:迭代法
  • 222. 完全二叉树的节点个数
    • 思路一:递归遍历计数
    • *思路二:借助完全二叉树性质

110. 平衡二叉树

leetcode题目地址

借助求最大树高的思路,在求树高的过程中若发现左右子树高度相差大于1则不是平衡树。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// java
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {private boolean result;public int getDepth(TreeNode root){if(root == null) return 0;int left = getDepth(root.left);int right = getDepth(root.right);if(Math.abs(left-right)>1) result = false;return left>right ? left+1 : right+1;}public boolean isBalanced(TreeNode root) {this.result = true;getDepth(root);return this.result;}
}

*257. 二叉树的所有路径

leetcode题目地址

回溯法,在访问到叶结点时开始记录路径。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// java
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public void backtracing(TreeNode root, List<String> result, List<Integer> path){// if(root == null) return;path.add(root.val);// 叶节点记录结果if(root.left == null && root.right == null){StringBuilder sb = new StringBuilder();for(int i=0; i<path.size()-1; i++){sb.append(path.get(i));sb.append("->");}  sb.append(path.get(path.size()-1));result.add(sb.toString());}if(root.left != null){backtracing(root.left, result, path);path.remove(path.size() - 1); // 回溯}if(root.right != null){backtracing(root.right, result, path);path.remove(path.size() - 1); // 回溯}}public List<String> binaryTreePaths(TreeNode root) {List<String> result = new ArrayList<>();List<Integer> path = new ArrayList<>();backtracing(root, result, path);return result;}
}

404. 左叶子之和

leetcode题目地址

思路一:递归法

递归遍历寻找左叶子返回其值,用一个标签来标记当前节点是左子树还是右子树。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// java
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public final static int LEFT = 0;public final static int RIGHT = 1;public int cal(TreeNode root, int tag){if(root == null) return 0;// 左叶结点if(root.left == null && root.right == null && tag == LEFT){return root.val;} // 普通节点int left = cal(root.left, LEFT);int right = cal(root.right, RIGHT);// 累加return left + right;}public int sumOfLeftLeaves(TreeNode root) {return cal(root, RIGHT);}
}

思路二:迭代法

// java
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public int sumOfLeftLeaves(TreeNode root) {if(root == null) return 0;int result = 0;Stack<TreeNode> st = new Stack<>();st.push(root);while(!st.isEmpty()){TreeNode node = st.pop();if(node.left != null &&node.left.left == null &&node.left.right == null){result += node.left.val;} if(node.left != null) st.push(node.left);if(node.right != null) st.push(node.right);}return result;}
}

222. 完全二叉树的节点个数

leetcode题目地址

思路一:递归遍历计数

直接使用前序遍历对树中节点进行统计。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// java
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {private int cnt;public void cal(TreeNode root){if(root == null) return ;cnt++;cal(root.left);cal(root.right);}public int countNodes(TreeNode root) {if(root == null) return 0;cnt = 0;cal(root);return cnt;}
}

*思路二:借助完全二叉树性质

题目说明提供的是一颗完全二叉树,因此可以借助完全二叉树性质来减少计算次数。

在一颗完全二叉树中,当一颗子树一直向左走和一直向右走的高度一致,则当前子树是一颗满二叉树。满二叉树的结点公式为: 2 h − 1 2^h -1 2h1h是树的高度。

当遇到满二叉树的子树直接用公式计算节点数返回可以减少计算。

// java
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public int countNodes(TreeNode root) {if(root == null) return 0;int leftDepth = 0, rightDepth = 0;TreeNode left = root.left, right = root.right;while(left != null){left = left.left;leftDepth++;}while(right != null){right = right.right;rightDepth++;}// 满二叉树直接用公式计算if(leftDepth == rightDepth){return (2 << leftDepth) - 1;}// 普通树按节点统计return countNodes(root.left) + countNodes(root.right) + 1;}
}

http://www.mrgr.cn/news/62272.html

相关文章:

  • Centos8安装图形化界面
  • 【Flutter_Web】Flutter编译Web第三篇(网络请求篇):dio如何改造方法,变成web之后数据如何处理
  • jenkins集成工具(一)部署php项目
  • CFA知识点梳理系列:CFA Level II, Reading 7 Economics of Regulation
  • OSI 网络 7 层模型
  • 【ETCD】【实操篇(十五)】etcd集群成员管理:如何高效地添加、删除与更新节点
  • #渗透测试#SRC漏洞挖掘# 信息收集-Shodan之网页版
  • 面试简历技巧分享
  • threejs开源实例-粒子地球
  • SSH免密钥登录
  • 分布式架构搭建博客网站
  • https加密过程详解
  • CountDownLatch与CyclicBarrier的比较应用
  • 头歌网络安全爬虫
  • Redis 发布订阅 总结
  • 图像篡改研究
  • 未来生活中的AI电脑是怎样的
  • 【Python单元测试】pytest框架单元测试常用用例
  • Go性能基础
  • 【股东权益与市值:概念、计算与差异分析】
  • 关于防止布局底部有弹簧而导致的QWidget闪烁问题
  • 12-Docker发布微服务
  • STM32的隐藏定时器---DWT
  • 为什么大模型都是Decoder-only结构?
  • Python入门——iter迭代器—__iter__()方法__next__()方法
  • 详解RabbitMQ三种队列类型