【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://xiahunao.cn/news/3245293.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Qt实现IP地址输入框-自定义控件

在 许多应用程序中,我们经常需要使用IP地址。为了方便用户输入和处理,一个好的解决方案是使用自定义控件。本示例代码使用Qt编写一个名为“IPAddress”的自定义控件来实现IP地址的输入功能。通过使用此控件,用户可以方便地输入和处理IP地址。…

【中项第三版】系统集成项目管理工程师 | 第 5 章 软件工程② | 5.4 - 5.8

前言 第 5 章对应的内容选择题和案例分析都会进行考查,这一章节属于技术的内容,学习要以教材为准。 目录 5.4 软件实现 5.4.1 软件配置管理 5.4.2 软件编码 5.4.3 软件测试 5.5 部署交付 5.5.1 软件部署 5.5.2 软件交付 5.5.3 持续交付 5.5.4…

全新升级!联想Windows 10 22H2专业版,一键下载!

联想Windows 10 22H2专业版系统适用于联想笔记本、台式机安装使用,全新优化升级,运作更流畅更稳定,丰富多样的系统功能,轻松满足用户日常学习、工作的使用需求。同时,该版本系统能够正常更新补丁,您也可以手…

useState函数

seState是一个react Hook(函数),它允许我们像组件添加一个状态变量,从而控制影响组件的渲染结果 数据驱动试图 本质:和普通JS变量不同的是,状态变量一旦发生变化组件的视图UI也会随着变化(数据驱动试图) 使用 修改状态 注意&am…

LabVIEW异步和同步通信详细分析及比较

1. 基本原理 异步通信: 原理:异步通信(Asynchronous Communication)是一种数据传输方式,其中数据发送和接收操作在独立的时间进行,不需要在特定时刻对齐。发送方在任何时刻可以发送数据,而接收…

Java猿社区—理解Java中的字符串比较机制

Java中的字符串比较是一个经典且常见的问题,尤其是在面试中。本文将详细探讨通过三种不同方式创建的字符串对象之间的比较机制,并扩展相关的技术问题,帮助读者深入理解Java的字符串处理。 文章目录 1. Java中的字符串对象创建方式2. 和equals…

在AWS创建一台Windows主机并登录

正文共:1111 字 21 图,预估阅读时间:1 分钟 因为之前微软云Azure免费,我们还做了简单的测试(白嫖党618福利!来Azure领200美刀!外加云主机免费用一年!);并且通…

睡前故事—绿色科技的未来:可持续发展的梦幻故事

欢迎来到《Bedtime Stories Time》。这是一个我们倾听、放松、并逐渐入睡的播客。感谢你收听并支持我们,希望你能将这个播客作为你睡前例行活动的一部分。今晚我们将讲述绿色科技的未来:可持续发展的梦幻故事的故事。一个宁静的夜晚,希望你现…

【15】Android基础知识之Window(一)

概述 这篇文章纠结了很久,在想需要怎么写?因为window有关的篇幅,如果需要讲起来那可太多了。从层级,或是从关联,总之不是很好开口。这次也下定决心,决定从浅入深的讲讲window这个东西。 Window Window是…

Win10+Docker配置TensorRT环境

1.Docker下载和安装 Docker下载:Install Docker Desktop on Windows Docker安装: 勾选直接下一步就行,安装完成后需要电脑重启。 重启后,选择Accept—>Continue without signing in—>skip survey. 可以进入下面页面,并且左下角是绿色的,显示e…

【踩坑日记】【教程】嵌入式 Linux 通过 nfs 下载出现 T T T T [Retry count exceeded: starting again]

文章目录 1 本篇文章解决的问题2 问题解决原理3 问题环境4 开启 ubuntu-20.04 的 nfs24.1 确认 nfs2 是否已经开启4.2 开启 nfs2 5 卸载 iptables5.1 卸载 iptables5.2 禁用 ufw5.3 尝试重新下载 6 原理分析6.1 nfs2 开启部分6.2 卸载 iptables 部分 7 后记7.1 拓扑结构一7.2 拓…

打包一个自己的Vivado IP核

写在前面 模块复用是逻辑设计人员必须掌握的一个基本功,通过将成熟模块打包成IP核,可实现重复利用,避免重复造轮子,大幅提高我们的开发效率。 接下来将之前设计的串口接收模块和串口发送模块打包成IP核,再分别调用…

Automation Anywhere推出新一代AI+自动化企业系统,助力企业实现10倍商业增长

RPA厂商纷纷进军AI Agent ( AI 代理)领域,陆续推出创新产品。最近,Automation Anywhere宣布推出其新的AI 自动化企业系统,该系统结合AI和自动化技术,以实现指数级的业务成果。 在Imagine 2024大会上首次亮相的这款新产品&#xf…

redis基本类型和订阅

redis-cli -h <host> -p <port> -a <password> 其中&#xff0c;< host>是Redis服务器的主机名或IP地址&#xff0c;< port>是Redis服务器的端口号&#xff0c;< password>是Redis服务器的密码&#xff08;如果有的话&#xff09;。 set …

Python | Leetcode Python题解之第240题搜索二维矩阵II

题目&#xff1a; 题解&#xff1a; class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:m, n len(matrix), len(matrix[0])x, y 0, n - 1while x < m and y > 0:if matrix[x][y] target:return Trueif matrix[x][y] > tar…

【java】力扣 合并两个有序数组

文章目录 题目链接题目描述代码第一种第二种 题目链接 88.合并两个有序数组 题目描述 代码 第一种 public void merge(int[] nums1, int m, int[] nums2, int n) {for(int i 0;i<n;i){nums1[mi] nums2[i];}Arrays.sort(nums1);}第二种 public void merge(int[] nums1,…

学习笔记——动态路由——IS-IS中间系统到中间系统(特性之路由泄漏)

3、路由泄漏 什么是路由泄漏&#xff1f; IS-IS路由协议允许路由信息的两级层次结构。可以有多个1级区域通过连续的2级主干互连。路由器可以属于1级、2级或两者。1级链路状态数据库仅包含有关该区域的信息。第2级链路状态数据库包含有关该级别以及每个第1级区域的信息。L1/L2…

【HarmonyOS学习】Calendar Kit日历管理

简介 Calendar Kit提供日历与日程管理能力&#xff0c;包括日历的获取和日程的创建能力。 Calendar Kit为用户提供了一系列接口来获取日历账户&#xff0c;并使用特定的接口向日历账户中写入日程。 如果写入的日程带有提醒时间则系统会在时间到达时向用户发送提醒。 约束点…

解决vue3中el-input在form表单按下回车刷新页面

问题&#xff1a;在input框中点击回车之后不是调用我写的回车事件&#xff0c;而是刷新页面 原因&#xff1a; 如果表单中只有一个input 框则按下回车会直接关闭表单 所以导致刷新页面 解决方法 &#xff1a; 再写一个input 表单 &#xff0c;并设置style"display:none&…

【学习笔记】虚幻SkeletalMesh学习(一)基础介绍

文章目录 零、前言一、资源介绍1.1 骨架资源1.2 骨架网格体资源 二、UE4中的定义2.1 骨骼数据2.2 模型网格数据 三、渲染3.1 RenderData的初始化3.2 渲染对象的创建3.3 渲染对象的更新3.3.1 游戏线程的更新&#xff08;*FSkeletalMeshObjectGPUSkin::Update*&#xff09;3.3.2 …