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

【JAVA数据结构】二叉树的常用方法(你想要的这里都有)

千万人中,万幸得以相逢

在这里插入图片描述

大家好,这里是新一,请多关照🙈🙉🙊。在本篇博客中,新一将会为大家介绍数据结构与算法之二叉树方法篇,二叉树有许多依托遍历的常用方法,这些方法对于我们弄懂二叉树有很大的帮助,为了方便大家理解,新一特地给大家附上了 源码和图片 便于大家理解,干货满满哟。(以下结果均在IDEA中编译)希望在方便自己复习的同时也能帮助到大家。😜😜😜🎪🚀🧰

以下是我们的文章


文章目录

  • 🎪 二叉树常用方法实现
    • 1.1 🚀 获取树中节点个数
    • 1.2 🚀 获取叶子节点个数
    • 1.3 🚀 求第K层节点个数
    • 1.4 🚀 获取二叉树的高度
    • 1.5 🚀 检测值为value的元素是否存在
    • 1.6 🚀 判断一棵树是不是完全二叉树
    • 1.7 🚀 层序遍历


🎪 二叉树常用方法实现

在这里插入图片描述
以上是我们要实现的方法二叉树用例,在这里新一先不用正式的方法构造一颗二叉树,二叉树的构造(内部类)我们在后续博客中说明,这里我们先临时构造一棵二叉树,如下:

public class BinaryTree {
    public TreeNode root;//二叉树的根节点

    public TreeNode createTree() {//暂时写法
        TreeNode A = new TreeNode('A');
        TreeNode B = new TreeNode('B');
        TreeNode C = new TreeNode('C');
        TreeNode D = new TreeNode('D');
        TreeNode E = new TreeNode('E');
        TreeNode F = new TreeNode('F');
        TreeNode G = new TreeNode('G');
        TreeNode H = new TreeNode('H');
        A.left = B;
        A.right = C;
        B.left = D;
        B.right = E;
        C.left = F;
        C.right = G;
        E.right = H;
        return A;
    }
}

我们要实现的方法如下:
在这里插入图片描述

1.1 🚀 获取树中节点个数

在这里插入图片描述

public int size2(TreeNode root){
        if (root == null){//判空
            return 0;
        }
        //递归遍历左右树
        return size2(root.left) + size2(root.right) + 1;
    }

1.2 🚀 获取叶子节点个数

在这里插入图片描述

public int getLeafNodeCount1(TreeNode root){
        if (root == null){//判空则返回0
            return 0;
        }
        if (root.left == null && root.right == null){
            return 1;//叶节点返回1
        }
        //递归遍历左右树
        return getLeafNodeCount1(root.left) + getLeafNodeCount1(root.right);
    }

1.3 🚀 求第K层节点个数

在这里插入图片描述

public int getLeafNodeCount2(TreeNode root, int k){
        if (root == null){//空返回0
            return 0;
        }
        if (k == 1){
            return 1;//递归访问k - 1后到达指定层数返回1
        }
        return getLeafNodeCount2(root.left, k - 1) + getLeafNodeCount2(root.right, k - 1);
    }

1.4 🚀 获取二叉树的高度

在这里插入图片描述

//时间复杂度O(n),空间复杂度O(log2(n))
    public int getHight(TreeNode root){
         if (root == null){//判空
             return 0;
         }
         //尽量不要用三目运算符 - 比较左右树最大高度
         return Math.max(getHight(root.left),getHight((root.right))) + 1;
    }

1.5 🚀 检测值为value的元素是否存在

在这里插入图片描述

public TreeNode find2(TreeNode root, char val){
        if (root == null){//为空不存在返回null
            return null;
        }
        if (root.val == val){
            return root;//找到节点
        }
        TreeNode ret = find2(root.left, val);//遍历左树
        if (ret != null){
            return ret;
        }else{//左树为空,遍历右树
            return find2(root.right, val);
        }
    }

1.6 🚀 判断一棵树是不是完全二叉树

在这里插入图片描述

public boolean  isCompleteTree(TreeNode root){
        if (root == null){//空树也为完全二叉树
            return true;
        }
        Queue<TreeNode> queue = new LinkedList<>();//队列
        queue.offer(root);//根节点入队
        while (queue.peek() != null){
            TreeNode cur = queue.poll();
            if (cur != null){
                queue.offer(cur.left);
                queue.offer(cur.right);
            }else{
                break;
            }
        }
        while (!queue.isEmpty()){
            if (queue.peek() != null){
                return false;
            }
            queue.poll();
        }
        return queue.isEmpty();
    }

1.7 🚀 层序遍历

在这里插入图片描述

public void levelOrder(TreeNode root){
        if (root == null){
            return;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (queue.peek() != null){
            TreeNode cur = queue.poll();
            System.out.print(cur.val + " ");//打印每层节点
            if (cur != null){
                if (cur.left != null) {//不为空入队
                    queue.offer(cur.left);
                }
                if (cur.right != null) {
                    queue.offer(cur.right);
                }
            }
        }
    }

相关文章:

  • vue实战-轮播图的最佳方案/swiper的使用
  • spring-cloud-netflix 组件概述
  • 【MICCAI 2022】PHTrans:并行聚合全局和局部表示以进行医学图像分割
  • 渗透学习-靶场篇-XSS-labs(持续更新中)
  • 【SpringCloud】三、 分布式系统的延迟和容错
  • Ultra Fast Deep Lane Detection with HybridAnchor Driven Ordinal Classification
  • CodeChef 补题
  • k8s 污点和容忍
  • Rust(6):高阶函数和发散函数
  • 交换机与路由技术-30-标准ACL
  • 软件测试——基础篇
  • 使用 Sprinkles 构建您自己的类型安全版本的 Tailwind CSS
  • 【第十一章 Set接口概述,HashSet,LinkedHashSet,TreeSet】
  • C语言动态内存管理(malloc,calloc,free,realloc)
  • JavaScript数组去重的方式
  • [译] React v16.8: 含有Hooks的版本
  • [译]如何构建服务器端web组件,为何要构建?
  • django开发-定时任务的使用
  • gcc介绍及安装
  • JavaScript设计模式系列一:工厂模式
  • Java深入 - 深入理解Java集合
  • Otto开发初探——微服务依赖管理新利器
  • Python3爬取英雄联盟英雄皮肤大图
  • Python利用正则抓取网页内容保存到本地
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 不上全站https的网站你们就等着被恶心死吧
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 无服务器化是企业 IT 架构的未来吗?
  • 应用生命周期终极 DevOps 工具包
  • 找一份好的前端工作,起点很重要
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # 透过事物看本质的能力怎么培养?
  • $jQuery 重写Alert样式方法
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)Android学习笔记 --- android任务栈和启动模式
  • ***通过什么方式***网吧
  • **python多态
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .describe() python_Python-Win32com-Excel
  • .NET Core 版本不支持的问题
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net MySql
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net web项目 调用webService
  • .NET 解决重复提交问题
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据