码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 算法宝典2——Java版本(此系列持续更新,这篇文章目前3道)(有题目的跳转链接)(此份宝典包含了二叉树的算法题)


    注:由于字数的限制,我打算把算法宝典做成一个系列,一篇文章就20题!!!

    目录

    一、二叉树的算法题(目前3道)

    1. 平衡二叉树(力扣)

    2.  对称二叉树(力扣)

    3. 二叉树的层序遍历(力扣)


    一、二叉树的算法题(目前3道)

    1. 平衡二叉树(力扣)

    题目跳转链接icon-default.png?t=N7T8https://leetcode.cn/problems/balanced-binary-tree/

    题目:给定一个二叉树,判断它是否是高度平衡的二叉树。

    本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 ,空树也是平衡二叉树。

    思路:

    代码:

    1. // 获取二叉树的高度
    2. public int maxDepth(TreeNode root){
    3. if(root == null){
    4. return 0;
    5. }
    6. int leftCount = maxDepth(root.left);
    7. int rightCount = maxDepth(root.right);
    8. return (leftCount > rightCount) ? leftCount + 1 : rightCount + 1;
    9. }
    10. //判断是否为平衡二叉树
    11. public boolean isBalanced(TreeNode root) {
    12. //如果为空树,返回null
    13. if(root == null){
    14. return true;
    15. }
    16. //获取左右子树的高度
    17. int leftTreeHigh = maxDepth(root.left);
    18. int righTreeHigh = maxDepth(root.right);
    19. //isBalanced(root.left) && isBalanced(root.left)是判断左右子树是不是也满足平衡二叉树的定义
    20. return Math.abs(leftTreeHigh - righTreeHigh) < 2
    21. && isBalanced(root.left) && isBalanced(root.right);
    22. }

    如果是按照上述代码的思路来写,此算法的时间复杂度就是O(n^2)!!!这是在是太大了!

    什么原因造成的呢?

    答:我们在求3结点的高度时,其实就把9结点的高度求出来了,但是递归到9结点的时候,又求了一次,导致重复求树的高度,有n个结点,每个结点就要求n次高度,也就是n*n!!!

    所以我们可以把代码改一下:

    1. public int maxDepth2(TreeNode root) {
    2. //空树,证明没有子树,他的高度就是0
    3. if(root == null){
    4. return 0;
    5. }
    6. int leftH = maxDepth2(root.left);//只要左子树的高度返回是-1,表示左子树不满足平衡二叉树的定义
    7. if(leftH < 0)
    8. return -1;
    9. int rightH = maxDepth2(root.right);//只要右子树的高度返回是-1,表示左子树不满足平衡二叉树的定义
    10. if (rightH < 0)
    11. return -1;
    12. if(Math.abs(leftH - rightH) <= 1){
    13. return Math.max(leftH,rightH) + 1;//满足定义,返回高度最高的子树,并+1
    14. }else{
    15. return -1;//不满足定义,返回-1
    16. }
    17. }
    18. public boolean isBalanced2(TreeNode root) {
    19. return maxDepth2(root) >= 0;
    20. }

    运行结果:

    2.  对称二叉树(力扣)

    题目跳转链接icon-default.png?t=N7T8https://leetcode.cn/problems/symmetric-tree/

    题目:给你一个二叉树的根节点 root , 检查它是否轴对称。

    思路:

    和这道判断两个二叉树是不是一样的题目类似:算法宝典1——Java版本(此系列持续更新,这篇文章有20道)(有题目的跳转链接)(此份宝典包含了链表、栈、队列、二叉树的算法题)_木子斤欠木同的博客-CSDN博客

    让左子树的左结点和右子树的右子树相比较,然后递归下去,然后就可以判断是不是对称二叉树!!!

    代码:

    1. //判断对称树
    2. public boolean isSymmetricChild(TreeNode leftChild, TreeNode rightChild) {
    3. //这是路径的判断
    4. if (leftChild != null && rightChild == null || leftChild == null && rightChild != null) {
    5. return false;
    6. }
    7. if (leftChild == null && rightChild == null) {
    8. return true;
    9. }
    10. //这是值的判断
    11. if (leftChild.val != rightChild.val) {
    12. return false;
    13. }
    14. return isSymmetricChild(leftChild.left, rightChild.right)
    15. && isSymmetricChild(leftChild.right, rightChild.left);
    16. }
    17. public boolean isSymmetric(TreeNode root) {
    18. if (root == null) {
    19. return true;
    20. }
    21. return isSymmetricChild(root.left,root.right);
    22. }

    运行结果:

    3. 二叉树的层序遍历(力扣)

    题目跳转链接icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-level-order-traversal/

    题目:给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

    思路:

    代码:

    1. //不带链表的形式
    2. public void levelOrder1(TreeNode root){
    3. if(root == null){
    4. return;
    5. }
    6. Queue queue = new LinkedList<>();
    7. queue.offer(root);
    8. while(!queue.isEmpty()){
    9. TreeNode poll = queue.poll();
    10. System.out.println(poll.val+ " ");
    11. if(poll.left != null){
    12. queue.offer(poll.left);
    13. }
    14. if(poll.left != null){
    15. queue.offer(poll.right);
    16. }
    17. }
    18. }
    19. //带链表的形式
    20. public List> levelOrder(TreeNode root) {
    21. List> List = new ArrayList<>();
    22. if(root == null){
    23. return List;
    24. }
    25. Queue queue = new LinkedList<>();
    26. queue.offer(root);
    27. while(!queue.isEmpty()){//第一层循环表示树什么时候遍历完
    28. int size = queue.size();
    29. List list = new ArrayList<>();
    30. while(size != 0){//第二层循环表示当前层次的元素数量
    31. TreeNode cur = queue.poll();
    32. size--;
    33. list.add(cur.val);//将元素保存到列表
    34. if(cur.left != null){
    35. queue.offer(cur.left);
    36. }
    37. if(cur.right != null){
    38. queue.offer(cur.right);
    39. }
    40. }
    41. List.add(list);
    42. }
    43. return List;
    44. }

    运行结果:

  • 相关阅读:
    【译】defer-panic-and-recover
    量子多体理论怎么样理解,多体系统的量子理论
    重学JavaSE 第7章 : 面向对象(中) 继承性、多态性、方法的重写、super、子类对象实例化过程、Object类、包装类
    PEG/蛋白Protein/抗体antibody 功能化修饰硫化锌量子点 ZnS QDs
    【云原生】微服务SpringCloud-eureka(server)集群搭建
    云原生时代下,如何打造开源监控体系?宏时数据在GOPS与你相聚
    Matlab中fdatool结合STM32F4设计滤波器
    SpringCloud Alibaba(七) - JWT(JSON Web Token)
    小程序端自定义导航栏-样式适配-安全距离
    如何增长LLM推理token,从直觉到数学
  • 原文地址:https://blog.csdn.net/ANNE_fly/article/details/132922369
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号