【Java--数据结构】二叉树

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



树结构

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合

注意:树形结构中,子树之间不能有交集,否则就不是树形结构

常见概念 

 节点的度:一个节点含有子树的个数,如A的度为6

树的度:一颗树所有节点的度的最大值,如上图中树的度为6

叶子节点(终端节点):度为0的节点,如P,Q节点

父节点(双亲节点):有子节点的节点,如A是B的父节点

子节点(孩子节点):与父节点相反,如B是A的子节点

根节点:没有父节点的节点,如A

节点的层次:从根节点为第1层 ,往下数,以此类推。

树的高度:树的最大层次数,如上图树的高度为4

树的应用

 二叉树

一棵二叉树是结点的一个有限集合,该集合: 为空或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成

 注意:每个节点最多有两颗子树,且有左右之分。

 二叉树的各种情况

满二叉树 与 完全二叉树

满二叉树:每层的节点都达到最大值。(若满二叉树的层数为k,则节点个数为2^K-1)

完全二叉树:每一层从左到右数,直到最后一个节点的前面必须是满的。(满二叉树是特殊的完全二叉树)

二叉树的性质:

前、中、后、层序遍历

前序遍历:根、左、右

中序遍历:左、根、右

后序遍历:左、右、根

层序遍历:从上到下,从左到右,依次遍历 

创建二叉树

二叉树的节点

public class TestBinaryTree {
    static class TreeNode{
        public char val;
        public TreeNode left;
        public TreeNode right;

        public TreeNode(char val){
            this.val=val;
        }
    }
}

 手动搭建一个二叉树

    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;
        E.right=H;
        C.left=F;
        C.right=G;

        return A;
    }

    public void preOrder (TreeNode root){
        if(root==null){
            return;
        }
        System.out.print(root.val+" ");
        //递归遍历左子树
        preOrder(root.left);
        //递归遍历右子树
        preOrder(root.right);
    }

    public void inOrder(TreeNode root){
        if(root==null){
            return;
        }
        inOrder(root.left);
        System.out.print(root.val+" ");
        inOrder(root.right);
    }
    public void postOrder(TreeNode root){
        if(root==null){
            return;
        }
        postOrder(root.left);
        postOrder(root.right);
        System.out.print(root.val+" ");
    }

测试

        TestBinaryTree testBinaryTree=new TestBinaryTree();
        TestBinaryTree.TreeNode root= testBinaryTree.createTree();
        testBinaryTree.preOrder(root);
        System.out.println();
        testBinaryTree.inOrder(root);
        System.out.println();
        testBinaryTree.postOrder(root);

根据 前序遍历 和 中序遍历

或者 后序遍历 和 中序遍历 可以创建二叉树

而 前序 和 后序 不能

获取整棵树的节点数size

子问题思路

左子树节点数+右子树节点数+1=整棵树的

    //求整个树的节点个数
    public int size(TreeNode root){
        if(root==null){
            return 0;
        }
        int ret=size(root.left)+size(root.right)+1;
        return ret;
    }

遍历思路

每遍历一个节点就++


    //遍历思路
    public int nodeSize;
    public void size2(TreeNode root){
        if(root==null){
            return;
        }
        nodeSize++;
        size2(root.right);
        size2(root.left);
    }

求叶子节点的个数

子问题思路

 整棵树的叶子节点个数=左树的+右树的

    public  int getLeafNodeCount(TreeNode root){
        if (root==null){
            return 0;
        }
        if (root.right==null&&root.left==null){
            return 1;
        }
        return getLeafNodeCount(root.right)+getLeafNodeCount(root.left);
    }

 遍历思路

    public  int leafSize;

    public void getLeafNodeCount2(TreeNode root) {
        if(root == null) {
            return ;
        }

        if(root.left == null && root.right == null) {
            leafSize++;
        }
        getLeafNodeCount2(root.left);
        getLeafNodeCount2(root.right);
    }

 计算第k层有多少个节点

已知前提:k是合法的


    public int getKLevalNodeCount(TreeNode root,int k){
        if(root==null){
            return 0;
        }
        if(k==1){
            return 1;
        }
        return getKLevalNodeCount(root.left,k-1)+getKLevalNodeCount(root.right,k-1);
    }

 求树的高度

整棵树的高度=Math.max(左树的高度和右树高度)+1

    //求树的高度
    public int getHeight(TreeNode root){
        if(root==null){
            return 0;
        }
        int leftHeight=getHeight(root.left);
        int rightHeight=getHeight(root.right);
//        return Math.max(leftHeight,rightHeight)+1;
        return leftHeight>rightHeight?
                leftHeight+1:rightHeight+1;
    }

找值为val的节点

//    找值为val的节点
    public TreeNode find(TreeNode root,char val){
        if(root==null){
            return null;
        }
        if(root.val==val){
            return root;
        }
        TreeNode ret=find(root.left,val);
        if(ret!=null){
            return ret;
        }
        ret=find(root.right,val);
        if(ret!=null){
            return ret;
        }
        return null;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/802328.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

昇思MindSpore学习开始

昇思MindSpore是一个全场景深度学习框架,旨在实现易开发、高效执行、全场景统一部署三大目标。 其中,易开发表现为API友好、调试难度低;高效执行包括计算效率、数据预处理效率和分布式训练效率;全场景则指框架同时支持云、边缘以…

二叉树、B树/B-树

二叉树 在中文语境中,节点结点傻傻分不清楚,故后文以 node 代表 "结点",root node 代表根节点,child node 代表 “子节点” 二叉树是诸多树状结构的始祖,至于为什么不是三叉树,四叉树,或许是因为计算机只能数到二吧,哈哈,开个玩笑。二叉树很简单,每个 no…

在android11 上实现平行视界效果

前言: 平行视界是谷歌为了解决大屏横屏设备 适配为手机等竖屏设备开发的APP , 在这类APP显示时 在横屏设备上不方便用户观看。 android 13 上平行视界的效果如下: 正文: 在android13前 ,各家有各自的解决方案,下面提…

[计算机网络] VPN技术

VPN技术 1. 概述 虚拟专用网络(VPN)技术利用互联网服务提供商(ISP)和网络服务提供商(NSP)的网络基础设备,在公用网络中建立专用的数据通信通道。VPN的主要优点包括节约成本和提供安全保障。 优…

心理健康服务小程序的设计

管理员账户功能包括:系统首页,个人中心,学生管理,最新资讯管理,心理产品管理,产品分类管理,音乐理疗管理,试题管理 微信端账号功能包括:系统首页,心理产品音…

学习大数据DAY17 PLSQL基础语法6和Git的基本操作

目录 包 存储过程调试功能 作业 阶段复习作业 Git课程目录 什么是版本控制 没有版本控制的缺点 常见的版本工具 版本控制分类 1. 本地版本控制 2. 集中版本控制 3. 分布式版本控制 Git与SVN主要区别 Git软件安装及配置 Windows系统安装Git 安装Tortoise Git(乌龟…

git和gitee的基本操作

目录 git常见命令 1.初始化工作区(在某一文件路径下) 2.查看当前工作区的代码文件状态 3.将工作区的代码文件提交到暂存区 4.将暂存区的代码文件提交到本地仓库 5.工作区和暂存区文件差异化比较 6.暂存区和本地仓库的差异化比较 7.工作区和本地仓库差异化比较 8.版本回…

自适应键盘,自带隐藏键盘的输入框(UITextField)

引言 在iOS开发中,输入框占据着举足轻重的地位。与安卓不同,iOS输入框经常面临键盘遮挡的问题,或者无法方便地取消键盘。为了解决这些问题,有许多针对iOS键盘管理的库,如IQKeyboardManager、TPKeyboardAvoiding和Keyb…

实习随笔【实现Json格式化与latex渲染】

【写在前面】在实习中,遇到了如下需求: 待格式化数据大概长这样,里面存在Json乱码以及由$$包裹的公式 目标格式: 一、Json格式化 我们这里的任务主要分为两部分: 解析一个可能包含嵌套的 JSON 字符串格式化 JSON 对象…

SAP ABAP性能优化分析工具

SAP系统提供了许多性能调优的工具,重点介绍下最常用几种SM50, ST05, SAT等工具: 1.工具概况 1.1 SM50 / SM66 - 工作进程监视器 通过这两个T-code, 可以查看当前SAP AS实例上面的工作进程,当某一工作进程长时间处于running的状态时&#…

支持前端路由权限和后端接口权限的企业管理系统模版

一、技术栈 前端:iview-admin vue 后端:springboot shiro 二、基于角色的权限控制 1、路由权限 即不同角色的路由访问控制 2、菜单权限 即不同角色的菜单列表展示 3、按钮权限 即不同角色的按钮展示 4、接口权限 即不同角色的接口访问控制 三…

C++——类和对象(下)

文章目录 一、再探构造函数——初始化列表二、 类型转换三、static成员静态成员变量静态成员函数 四、 友元友元函数友元类 五、内部类六、匿名对象 一、再探构造函数——初始化列表 之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函…

16_网络IPC2-寻址

进程标识 字节序 采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高位存放在低地址,小端方式将高位存放在高地址。 采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。到目前…

QT使用QPainter绘制多边形维度图

多边形统计维度图是一种用于展示多个维度的数据的图表。它通过将各个维度表示为图表中的多边形的边,根据数据的大小和比例来确定各个维度的长度。 一、简述 本示例实现六边形战力统计维度图,一种将六个维度的战力统计以六边形图形展示的方法。六个维度是…

WebAssembly与JavaScript的交互(1)

前一阵子利用Balazor开发了一个NuGet站点,对WebAssembly进行了初步的了解,觉得挺有意思。在接下来的一系列文章中,我们将通过实例演示的方式介绍WebAssembly的一些基本概念和编程模式。首先我们先来说说什么是WebAssembly,它主要帮…

微调 Florence-2 - 微软的尖端视觉语言模型

Florence-2 是微软于 2024 年 6 月发布的一个基础视觉语言模型。该模型极具吸引力,因为它尺寸很小 (0.2B 及 0.7B) 且在各种计算机视觉和视觉语言任务上表现出色。 Florence 开箱即用支持多种类型的任务,包括: 看图说话、目标检测、OCR 等等。虽然覆盖面…

LRC软件、Adobe Lightroom Classic软件多版本下载+LRC教程

简介: Adobe Lightroom Classic(简称LR)是Adobe Creative Cloud大家庭中的一款专业的图片管理和编辑工具,用于专业摄影师、摄影爱好者以及所有不断优化数码影像的人等。其目标是以丰富的功能提供高效、一致的体验,帮助…

php基础: 三角形

包含&#xff1a;左三角、左上三角、右三角、右上三角、等腰三角、倒等腰三角。注意空格的数量&#xff0c;因为*号后面加了空格 /*** * 左三角形* param $n* return void*/ function triangleLeft($n){echo <pre>;for ($i 1; $i < $n; $i) {for ($j 1; $j < $i…

对服务器进行基本了解(二)

目录 一. 云服务器数据库 1.查看MYSQL版本 2.查看mysql的运行状态 3.运行mysql 4. 进入mysql的用户 5. 更改用户密码 6. 查找mysql端口号 7. 创建一个数据库 8. 查看用户 9. 查看数据库 10. 显示数据库的表 11. 修改用户的host 12. 对用户赋权 13. 开放指定端…

java.lang.IllegalArgumentException: Illegal character in path at index 40解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…