树概念及二叉树

Java面试、笔试题 19、Jdo是什么?4、J2EE是什么?1、Tomcat的优化经验..................................................................................................................................................................................................................47。 阅读详情

树的表示三种方法

1、双亲表示法

假设以一组连续空间存储树的结点,同时在每个结点中附设一个指示器指示其双亲结点在链表中的位置,其形式说明如下:
在这里插入图片描述
在这里插入图片描述
这种存储结构利用了每个结点(除根以外)只有惟一的双亲的性质。PARENT(T,x)操作可以在常量时间内实现。反复调用PARENT操作,直到遇见无双亲的结点时,便找到了树的根,这就是ROOT(x)操作的执行过程。但是,在这种表示法中,求结点的孩子时需要遍历整个结构

2、孩子表示法

由于树中每个结点可能有多棵子树,则可用多重链表,即每个结点有多个指针域,其中每个指针指向一棵子树的根结点,此时链表中的结点可以有如下两种结点格式。
在这里插入图片描述
若采用第一种结点格式,则多重链表中的结点是同构的,其中d为树的度。由于树中很多结点的度小于d,所以链表中有很多空链域,空间较浪费,不难推出,在一棵有n个结点度为k的树中必有n(k-1)+1个空链域。若采用第二种结点格式,则多重链表中的结点是不同构的,其中J为结点的度,degre域的值同J。此时,虽能节约存储空间,但操作不方便。

另一种办法是把每 个结点的孩子结点排列起来 ,看成是一个线性表,且以单链表作存储结构,则n个结点有n个孩子链表(叶子的孩子链表为空表)。而n个头指针又组成一个线性表,为了便于查找,可采用顺序存储结构。这种存储结构可形式地说明如下:
在这里插入图片描述在这里插入图片描述
图6.14(a)是图6.13中的树的孩子表示法。与双亲表示法相反,孩子表示法便于那些涉及孩子的操作的实现,却不适用于PARENT(T,x)操作,我们可以把双亲表示法和孩子表示法结合起来,即将双亲表示和孩子链表合在一起。图6.14(b)就是这种存储结构的一例,它和图6.14(a)表示的是同一棵树。

3、孩子兄弟表示法 (相当于前面讲的将一颗树转换成一颗二叉树)

又称二叉树表示法,或二又链表表示法,即以二又链表作树的存储树的存储结构。链表中结点的两个链城分别指向该结点的第一个孩子结点和下一个兄弟结点,分别命名为firstchild城和nextsibling城。
在这里插入图片描述
在这里插入图片描述
图6.15是图6.13中的树的孩子兄弟链表。利用这种存储结构便于实现各种树的操作。首先易于实现找结点孩子等的操作。例如:若要访问结点x的第i个孩子,则只要先从firstchild域找到第1个孩子结点,然后沿着孩子结点的nextsibling域连续走i-1步,便可找到x的第i个孩子。当然,如果为每个结点增设一个PARENT域,则同样能方便地实现PARENT(T,x)操作。

一、二叉树的四种遍历方式

在这里插入图片描述
先序遍历:A → B → D → C
中序遍历:B → D → A → C
后续遍历:D → B → C → A
层序遍历:A → B → C → D
先序、中序、后序其实指的是父节点被访问的次序。若在遍历过程中,父节点先于它的子节点被访问,就是先序遍历;父节点被访问的次序位于左右孩子节点之间,就是中序遍历;访问完左右孩子节点之后再访问父节点,就是后序遍历。不论是先序遍历、中序遍历还是后序遍历,左右孩子节点的相对访问次序是不变的,总是先访问左孩子节点,再访问右孩子节点。而层次遍历,就是按照从上到下、从左向右的顺序访问二叉树的每个节点。

package test;

import java.util.LinkedList;  
import java.util.List;  
  
/** 
 * 功能:把一个数组的值存入二叉树中,然后进行3种方式的遍历 
 *  
 * @author huapro @date: 2022-02-21 
 *  
 */  
public class BinTreeTraverse2 {  
  
    private int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
    private static List<Node> nodeList = null;  
  
    /** 
     * 内部类:节点 
     *  
     * @author ocaicai@yeah.net @date: 2011-5-17 
     *  
     */  
    private static class Node {  
        Node leftChild;  
        Node rightChild;  
        int data;  
  
        Node(int newData) {  
            leftChild = null;  
            rightChild = null;  
            data = newData;  
        }  
    }  
  
    public void createBinTree() {  
        nodeList = new LinkedList<Node>();  
        // 将一个数组的值依次转换为Node节点  
        for (int nodeIndex = 0; nodeIndex < array.length; nodeIndex++) {  
            nodeList.add(new Node(array[nodeIndex]));  
        }  
        // 对前lastParentIndex-1个父节点按照父节点与孩子节点的数字关系建立二叉树  
        for (int parentIndex = 0; parentIndex < array.length / 2 - 1; parentIndex++) {  
            // 左孩子  
            nodeList.get(parentIndex).leftChild = nodeList.get(parentIndex * 2 + 1);  
            // 右孩子  
            nodeList.get(parentIndex).rightChild = nodeList.get(parentIndex * 2 + 2);
        }  
        // 最后一个父节点:因为最后一个父节点可能没有右孩子,所以单独拿出来处理  
        int lastParentIndex = array.length / 2 - 1;  
        // 左孩子  
        nodeList.get(lastParentIndex).leftChild = nodeList  
                .get(lastParentIndex * 2 + 1);  
        // 右孩子,如果数组的长度为奇数才建立右孩子  
        if (array.length % 2 == 1) {  
            nodeList.get(lastParentIndex).rightChild = nodeList  
                    .get(lastParentIndex * 2 + 2);  
        }  
    }  
  
    /** 
     * 先序遍历 
     * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已 
     * @param node 
     * 遍历的节点 
     */  
    public static void preOrderTraverse(Node node) {  
        if (node == null)  
            return;  
        System.out.print(node.data + " ");  
        preOrderTraverse(node.leftChild);  
        preOrderTraverse(node.rightChild);  
    }  
  
    /** 
     * 中序遍历 
     * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已 
     * @param node 
     * 遍历的节点 
     */  
    public static void inOrderTraverse(Node node) {  
        if (node == null)  
            return;  
        inOrderTraverse(node.leftChild);  
        System.out.print(node.data + " ");  
        inOrderTraverse(node.rightChild);  
    }  
  
    /** 
     * 后序遍历 
     * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已 
     * @param node 
     * 遍历的节点 
     */  
    public static void postOrderTraverse(Node node) {  
        if (node == null)  
            return;  
        postOrderTraverse(node.leftChild);  
        postOrderTraverse(node.rightChild);  
        System.out.print(node.data + " ");  
    }  
  
    public static void main(String[] args) {  
        BinTreeTraverse2 binTree = new BinTreeTraverse2();  
        binTree.createBinTree();  
        // nodeList中第0个索引处的值即为根节点  
        Node root = nodeList.get(0);  
  
        System.out.println("先序遍历:");  
        preOrderTraverse(root);  
        System.out.println();  
  
        System.out.println("中序遍历:");  
        inOrderTraverse(root);  
        System.out.println();  
  
        System.out.println("后序遍历:");  
        postOrderTraverse(root);  
    }  
}

二、几种特殊的二叉树

1、满二叉树

所有叶结点同处于最底层(非底层结点均是内部结点),一个深度为k(>=-1)且有2^(k+1) - 1个结点(满二叉树可以为空)。
满二叉树

2、完全二叉树

**叶结点只能出现在最底层的两层,且最底层叶结点均处于次底层叶结点的左侧。**规模为n的完全二叉树,高度为
完全二叉树

3、平衡二叉树

平衡二叉树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法,AVL 树是一种平衡二叉树,得名于其发明者的名字( Adelson-Velskii 以及 Landis)),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci(斐波那契)数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。
对于平衡二叉树要特别注意的是,不要求非叶节点都有两个子结点,仅要求两个子树的高度差的绝对值不超过1,或者为空树。
平衡二叉树

三、存储方式

存储的方式和图一样,有链表和数组两种,用数组存访问速度快,但插入、删除节点操作就比较费时了。实际中更多的是用链来表示二叉树的。

最新Java笔试题及答案,java高分面试指南 单个redis节点的并发能力是有限的,所以为了提高并发能力,我们需要搭建redis集群,就比如:主从复制。主从复制的流程主从复制主要分为:全量同步和增量同步。全量同步:在salve请求数据同步的时候会携带application Id和offset,如果master判断出applid和自己的不一样,就认为slave是第一次进行同步,所以会进行全量同步。 阅读详情

相关推荐

【数据结构】 树与二叉树的基本概念、结构特点及性质

前言:本章内容主要是数据结构中树与二叉树的基本概念、结构特点及性质的引入。 文章目录树的概念树的特点:树的常用术语:树的表示:代码创建:树在实际中的应用:二叉树的概念特殊的二叉树满二叉树完全二叉树二叉树的性质及其推导:练习题:习题1:习题2:习题3: 树的概念 数据结构中的定义的树比较有趣,它是我们所见真实树的倒置,然后再抽象的一种结构,比较有意思。同时使用树这种数据结构,可以描述现实生活中的很多事物,例如家谱、企业的组织架构等等。 树是由n(n>=0)个有限结点组成一个具有层次关系的集

林慢慢的博客 6760

Java笔试题大全(附带答案)

一、单选题 1.下列哪一种叙述是正确的(D) A.abstract修饰符可修饰字段、方法和类 B. 抽象方法的body部分必须用一对大括号{ }包住 C. 声明抽象方法,大括号可有可无 D.声明抽象方法不可写出大括号 2.如下代码 public class Test { public int aMethod() { static int i = 0; i++; return i; } public static void main (String args[]) { Test test = new Test

web13618542420的博客 1万+

Java面试笔试题大汇总(最全+详细答案)

Java面试笔试题大汇总(最全+详细答案)

2022Java笔试题选择题整理(附答案解析)走过路过不要错过了喂!

2022Java笔试题选择题

weixin_43474701的博客 1万+

基于PINN的一个简单的求解偏微分方程实例

本人是做化工模拟的一名学生,最近在学习PINN(Physics-Informed Neural Networks,物理信息神经网络)对管道动力学进行建模研究,PINN由于其对机理与数据的良好兼顾性非常热门,本文是作者对PINN入门研究过程的一个练手小题目,main code也是作者代码是基于pytorch2.6.0写的,发上来供各位参考,欢迎研究管道动力学和PINN的小伙伴一起讨论~

weixin_64491760的博客 1740

activiti(六):activiti7的数据表和字段的解释

介绍activiti7的数据表和各表字段的含义,对于学习activiti7工作流引擎的运行过程很有帮助!

no problem的博客 1万+

树的基本概念与二叉树

树是一种非线性的数据结构,它是由 n (n≥0) 个有限结点组成一个具有层次关系的集合。之所以称之为"树",是因为它的结构看起来像一棵倒挂的树,根朝上,叶子朝下。树是一种非常重要且常用的数据结构,在计算机科学领域有着广泛的应用。对于一棵高度为 h 的满二叉树,它一共有 (2^h)-1 个节点。二叉树是一种特殊的树形结构,它实行了"计划生育",每个节点最多只能有两个孩子。双亲表示法不存储指向孩子的指针,只存储指向父亲的指针或下标。对于高度为 h 的完全二叉树,其节点数的范围是。

猪肉炖粉条的博客 1270

实战指南:基于汇川PLC与EtherNET/IP的无线以太网通信配置详解

本文提供了一份详细的实战指南,讲解如何配置汇川PLC基于EtherNET/IP协议的无线以太网通信。通过硬件选型(如达泰DTD419MB模块)、软件设置(使用AutoShop配置IP与I/O映射)及通信测试,实现PLC间稳定、灵活的数据交换,有效解决工业现场布线难题,提升部署与维护效率。

lake5的博客 613

树的概念及二叉树

目录1. 树的概念1.1 树的定义1.2 结点分类1.3 结点间关系1.4 其他相关概念2. 二叉树概念2.1 二叉树定义2.2 特殊二叉树2.2.1 斜树2.2.2 满二叉树2.2.3 完全二叉树2.3 二叉树性质3. 二叉树顺序存储3.1 二叉树的顺序存储结构3.2 二叉树的顺序存储操作3.2.1 二叉树的构造及初始化3.2.2 获取二叉树的深度3.2.3 获取二叉树的结点值3.2.4 给二叉...

郭永明的技术专栏 3790

Infineon MOSFET开关损耗计算实战指南

本文是英飞凌MOSFET开关损耗计算的实战指南。针对MOSFET发热问题,文章深入剖析了开关损耗的产生机理,并基于Infineon数据手册的关键参数,手把手推导了开通与关断损耗的工程计算公式。同时,指南强调了栅极电阻、寄生参数等实际因素对损耗的影响,并提供了从理论计算到实测优化的完整路径,帮助工程师精准评估与优化电源设计。

weixin_29212867的博客 442

零基础微信理财通基金实操指南(2026版)

先活下来:保证不亏大钱,再想赚钱慢慢变富:年化10%,7年翻倍,这已经很好了开始比完美重要:今天先存100元到零钱通,就是最好的开始现在打开微信,进入理财通,完成第一步风险测评吧!有任何问题可以随时问,我会用最通俗的方式解释。

老韩的Linux云计算架构师进阶之路 1688

树的概念+二叉树概念(概念篇)

7树的高度或深度。

2503_90699524的博客 1056

电源设计避坑指南:半桥LLC软启动的5个常见错误及解决方案

本文针对半桥LLC谐振变换器软启动过程中的五个常见设计错误,提供了详细的工程解决方案。重点分析了忽视谐振腔初始状态导致的电流冲击、软启动斜坡与环路带宽不匹配、开环到闭环切换时机不当、变压器偏磁以及参数未考虑边界条件等问题,并给出了包括主动预充电、自适应斜坡、最佳切换点判定等实用调试技巧,帮助工程师实现平稳可靠的电源启动。

weixin_29260291的博客 280

树与二叉树概念

人像一粒种子偶然地飘落到这个世界上,没有任何本质可言,只有存在着,要想确立自己的本质必须通过自己的行动来证明。人不是别的东西,而仅仅是他自己行动的结果。 文章目录1.树概念及结构1.1树的概念1.2树的相关概念1.3树的表示1.4 树在实际中的应用(表示文件系统的目录树结构)2.二叉树概念及层次2.1概念2.2现实中的二叉树:2.3 特殊的二叉树:2.4二叉树的性质3.基本概念选择题 1.树概念及结构 1.1树的概念 树是一种非线性的数据结构,它是由n(n>=0)个有限节点组成一个具有层次关系的集.

iwkxi的博客 1323

如何解决群晖Docker注册表查询失败/无法拉取镜像等问题

如何解决群晖Docker注册表查询失败/无法拉取镜像等问题

XiaoqiangClub的博客 1万+

YOLOv8改进:基于EfficientNetV2均衡缩放网络的特征提取层优化【YOLOv8】

YOLO(You Only Look Once)系列模型以其高效的实时目标检测能力而闻名。YOLOv8作为该系列的最新版本,通过引入改进的网络结构和算法优化,进一步提升了目标检测的性能。然而,YOLOv8在特征提取阶段的网络结构仍有改进的空间。EfficientNetV2是一种基于均衡缩放的卷积神经网络,它通过优化网络的宽度、深度和分辨率来实现高效的特征提取。与之前的EfficientNet版本相比,EfficientNetV2在速度和精度上都有显著提升,尤其在处理复杂目标检测任务时表现尤为突出。

博客 1582

【数据结构】树、二叉树概念

树、二叉树概念

2203_76003626的博客 1197

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

DS:树与二叉树的相关概念

本片博客姐详细介绍了树和二叉树的相关概念、结构及其名词解释,喜欢的uu码住哦!

白乐天_ξ( ✿>◡❛)的博客 1519

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

树,二叉树的概念与结构

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

qq_74276498的博客 841

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

树以及二叉树的基本概念

树以及二叉树的基本概念 掌握树的基本概念 掌握树的相关概念 掌握树的表示方式 熟悉二叉树的基本概念以及特性 熟悉完全二叉树以及满二叉树的概念 熟悉二叉树的性质:1 2 3 4 5 熟悉二叉树的存储方式 掌握树的基本概念 树是一种非线性的数据结构,它是由n(n >= 0) 个有限节点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下的...

PNUHC的博客 436

【数据结构】树以及二叉树的概念

【数据结构】树以及二叉树的概念

一个喜欢猫咪的程序员 1529

树与二叉树的概念

树与二叉树的概念

Excuse_lighttime的博客 1277

【数据结构】二叉树(一)——树和二叉树的概念及结构

本篇博客主要了解什么是树,什么是二叉树,以及他们的概念和结构。

weixin_73551991的博客 1685

树与二叉树的基本概念

学习基本二叉树

xiao_xiaoxing_的博客 985

树以及简单二叉树的概念

许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。深度为k,有n个节点的二叉树当且仅当其每一个节点都与深度为k的满二叉树中编号从1到n的节点一一对应时,称为完全二叉树。如果一棵二叉树只有度为0的节点和度为2的节点,并且度为0的节点在同一层上,则这棵二叉树为满二叉树。就是根到叶之间所有的节点,因为叶可能有多个,所以树的深度是那个最大的,比如,该树的深度就是4。像B,C就是兄弟节点,G,H,I也是兄弟节点。

qq_73752525的博客 140
上一篇: 前缀树(Trie)
下一篇: RPC 框架总结
huapro.vip
博客等级 码龄15年 36粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值