数据结构与算法-树与二叉树

数据结构与算法——树和二叉树 1、二叉树:是n个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的分别称作这个根左子树和右子树的二叉树组成。2、特点:(1)每个结点最多有两个孩子(2)子树有左右之分,其次序不能颠倒(3)二叉树可以是空集合,根可以有空的左子树或空的右子树3、二叉树的性质(1)性质1:在二叉树的第i层上至多有个结点(i>=1)(2)性质2:深度为k的二叉树至多有个结点(k>=1)(3)性质3:对任何一棵二叉树T,如果其叶子数为n0,度为2的结点数为n2,则n0=n2+1。 阅读详情

树的基本概念

二叉树是一种能够将链表插入的灵活性和有序数组查找的高效性结合起来的一种数据结构。

基本术语

Edge、Root、Leaf

è¿éåå¾çæè¿°

Path

è¿éåå¾çæè¿°

Height

è¿éåå¾çæè¿°

需要注意的是叶子节点的高度为0,如果树只有一个节点,那么这个节点的高也是0

Depth

è¿éåå¾çæè¿°

需要注意的是根节点的深度(Depth)是0.

从Height和Depth的对比,它们的方向刚好是相反的。

Level

节点的Level是从1开始的,Level = Depth+1,根节点的Level=1

也有很多书籍上Level是从0开始的,这样的话Level就等于Depth,根节点的Level=0

二叉树的分类

满二叉树

在一棵二叉树中。如果所有分支节点都存在左子树和右子树,并且所有叶子节点都在同一层上,这样的二叉树称为满二叉树。

满二叉树的特点有:

1)叶子节点只能出现在最下一层。出现在其它层就不可能达成平衡。

2)非叶子姐弟啊的度一定为2.

3)在同样深度的二叉树中,满二叉树的节点个数最多,叶子数最多。

完全二叉树

除了最后一层都是满的(都有两个子节点),并且最后一层的节点是从左往右排列的。

完全二叉树,通俗点说就是节点按层从左往右排列。如果最后一层排满了就是满二叉树,没有满则是完全二叉树

å®å¨äºåæ 

二叉树性质

1)在二叉树的第i层上最多有2^(i-1) 个节点 。(i>=1)
2)二叉树中如果深度为k,那么最多有2^k-1个节点。(k>=1)
3)n0=n2+1 n0表示度数为0的节点数,n2表示度数为2的节点数。
4)在完全二叉树中,具有n个节点的完全二叉树的深度为[log2n]+1,其中[log2n]是向下取整。
5)若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点有如下特性:

(1) 若 i=1,则该结点是二叉树的根,无双亲, 否则,编号为 [i/2] 的结点为其双亲结点;
(2) 若 2i>n,则该结点无左孩子, 否则,编号为 2i 的结点为其左孩子结点;
(3) 若 2i+1>n,则该结点无右孩子结点, 否则,编号为2i+1 的结点为其右孩子结点。

二叉树的存储结构:

1.顺序存储

顺序存储结构就是使用一维数组存储二叉树中的节点,并且节点的存储位置,就是数组的下标索引。

由上图可以看出,当二叉树为完全二叉树时,节点数刚好存满数组。

如果二叉树不是完全二叉树呢????

上图中,浅色的节点代表不存在,那么顺序存储的结构为:

可以看出,非完全二叉树,会导致空间浪费。

2.链式存储

如果顺序存储不能满足二叉树的存储要求,那么可以考虑使用链式存储。可以将数据结构定义为一个数据和两个指针域。

代码为:

public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int x) { val = x; }
}

上图的用链式存储为:

 二叉树遍历

二叉树的遍历是指从二叉树的根节点出发,按照某种次序依次访问二叉树中的所有接节点,使得每个节点被访问依次,且仅被访问依次。

二叉树的访问次序可以分为四种:

前序遍历

中序遍历

后续遍历

层序遍历

前序遍历

通俗的说就是从二叉树的根结点出发,当第一次到达结点时就输出结点数据,按照先向左再向右的方向访问。

从根结点出发,则第一次到达结点A,故输出A;
继续向左访问,第一次访问结点B,故输出B;
按照同样规则,输出D,输出H;
当到达叶子结点H,返回到D,此时已经是第二次到达D,故不在输出D,进而向D右子树访问,D右子树不为空,则访问至I,第一次到达I,则输出I;
I为叶子结点,则返回到D,D左右子树已经访问完毕,则返回到B,进而到B右子树,第一次到达E,故输出E;
向E左子树,故输出J;
按照同样的访问规则,继续输出C、F、G;

二叉树的前序遍历输出为:
ABDHIEJCFG

中序遍历

中序遍历就是从二叉树的根结点出发,先访问左节点,再访问父节点,最后访问右节点。

从根结点出发,则第一次到达结点A,不输出A,继续向左访问,第一次访问结点B,不输出B;继续到达D,H;
到达H,H左子树为空,则返回到H,此时第二次访问H,故输出H;
H右子树为空,则返回至D,此时第二次到达D,故输出D;
由D返回至B,第二次到达B,故输出B;
按照同样规则继续访问,输出J、E、A、F、C、G;

二叉树的中序遍历输出为:
HDIBJEAFCG

后序遍历

后序遍历就是从二叉树的根结点出发,当第三次到达结点时就输出结点数据,按照先向左在向右的方向访问。

二叉树后序访问如下:

从根结点出发,则第一次到达结点A,不输出A,继续向左访问,第一次访问结点B,不输出B;继续到达D,H;
到达H,H左子树为空,则返回到H,此时第二次访问H,不输出H;
H右子树为空,则返回至H,此时第三次到达H,故输出H;
由H返回至D,第二次到达D,不输出D;
继续访问至I,I左右子树均为空,故第三次访问I时,输出I;
返回至D,此时第三次到达D,故输出D;
按照同样规则继续访问,输出J、E、B、F、G、C,A;

二叉树的后序遍历输出为:
HIDJEBFGCA

虽然二叉树的遍历过程看似繁琐,但是由于二叉树是一种递归定义的结构,故采用递归方式遍历二叉树的代码十分简单。
递归实现代码如下:

package huawei.tree;

public class OrderTraverse {

    /*二叉树的前序遍历递归算法*/
    public void preOrderTraverse(TreeNode root) {
        if(root == null) {
            return;
        }
        System.out.println(root.val);
        preOrderTraverse(root.left);    /*再先序遍历左子树*/
        preOrderTraverse(root.right);    /*最后先序遍历右子树*/
    }


    /*二叉树的中序遍历递归算法*/
    public void inOrderTraverse(TreeNode root) {
        if(root == null) {
            return;
        }
        inOrderTraverse(root.left); /*中序遍历左子树*/
        System.out.println(root.val);
        inOrderTraverse(root.right); /*最后中序遍历右子树*/
    }


    /*二叉树的后序遍历递归算法*/
    public void postOrderTraverse(TreeNode root) {
        if(root == null) {
            return;
        }
        postOrderTraverse(root.left);   /*先后序遍历左子树*/
        postOrderTraverse(root.right);   /*再后续遍历右子树*/
        System.out.println(root.val); /*显示结点数据,可以更改为其他对结点操作*/
    }
}

层次遍历

层序遍历也就是广度优先遍历

import huawei.tree.TreeNode;
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

public class BinaryTreeBfs {
    static List<TreeNode> res = new ArrayList<>();
    public static void main(String[] args) {
        TreeNode head = new TreeNode(1);
        TreeNode second = new TreeNode(2);
        TreeNode three = new TreeNode(3);
        TreeNode four = new TreeNode(4);
        TreeNode five = new TreeNode(5);
        TreeNode six = new TreeNode(6);
        TreeNode seven = new TreeNode(7);
        head.right = three;
        head.left = second;
        second.right = five;
        second.left = four;
        three.right = seven;
        three.left = six;
        System.out.print("广度优先遍历结果:");
        new BinaryTreeBfs().boardFirstSearch(head);
        for (TreeNode node : res) {
            System.out.print(node.val + " ");
        }
    }


    //广度优先使用Queue
    public void boardFirstSearch(TreeNode root) {
        if (root == null) {
            return;
        }
        Deque<TreeNode> deque = new LinkedList<>();
        deque.offer(root);
        while (!deque.isEmpty()) {
            TreeNode node = deque.poll();
            res.add(node);
            if (node.left != null) {
                deque.offer(node.left);
            }
            if (node.right != null) {
                deque.offer(node.right);
            }
        }
    }
}

 

数据结构之树--二叉树/B树/B+树/红黑树及相关算法 树 定义:由一个根结点和m个非根结点组成(m &amp;amp;amp;gt;= 0),其中每个结点下连接n个子结点(n &amp;amp;amp;gt;= 0),非根结点且无子结点的称为叶子结点 树与图的区别在于树中没有一个闭环 二叉树 定义:即每个结点都最多只有两个子结点的树 完全二叉树:高度为k的二叉树,其1~h-1层为满结点,且其h层(叶子结点层)的节点从左至右依次排列(最多2^h-1个,最少0个) 满二叉树:除最后一层外... 阅读详情

相关推荐

matlab特征提取和分类_SAST Weekly|MATLAB机器学习初探——做个心音分类器

SAST weekly 是由电子工程系学生科协推出的科技系列推送,内容涵盖信息领域技术科普、研究前沿热点介绍、科技新闻跟进探索等多个方面,帮助同学们增长姿势,开拓眼界,每周更新,欢迎关注!欢迎愿意分享知识的同学投稿至 eesast@mail.tsinghua.edu.cn , 期待你的作品!本期的SAST weekly,想跟大家分享一下如何用MATLAB进行初步的机器学习,构建一个正常/...

weixin_36453829的博客 5579

数据结构和算法学习记录——树(基本介绍、树的定义、树的特点、树的一些基本术语、树的表示、儿子-兄弟表示法)

树:n(n >= 0)个节点构成的有限集合。当n = 0时,称为空树;对于任意一颗非空树(n > 0),它具备以下性质:1.树中有一个称为“根(Root)”的特殊节点,用r表示;2.其余节点可分为m(m > 0)个互不相交的有限集T1,T2,...,Tm,其中每个集合本身又是一颗树,称为原来树的“子树(SubTree)”。每一个子树又是一颗树树的特点.子树是不相交的除了根节点外,每个节点有且仅有一个父节点;3.一颗N个节点的树有N-1条边。

li13437542099的博客 1562

腾讯地图自定义瓦片地图开发实战:从坐标定位到图层融合

本文详细介绍了腾讯地图自定义瓦片地图开发的全流程,从坐标定位到图层融合的实战技巧。通过具体代码示例和常见问题解决方案,帮助开发者快速掌握腾讯地图API的自定义瓦片功能,实现室内外地图的无缝衔接和特殊图层的叠加展示。

weixin_42526015的博客 171

(一)树(高度,深度)与二叉树的实现

1. 树 2. 二叉树

chumingqian的博客 4308

【网络协议】TCP的拥塞控制机制

前言 计算机网络中的带宽、交换节点中的缓存和处理机等,都是网络的资源,在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞。 所谓拥塞控制,就是防止过多的数据注入到网络中,从而使网络中的路由器或链路不致过载。要注意用拥塞控制与流量控制的区别,拥塞控制是一个全局性的过程,涉及到所有的额主机、路由器,以及与降低网 拥塞控制的算法有:慢开始、拥塞避免、快重传、快恢复四种。 慢开始和拥塞避免 发送方维持一个拥塞窗口的状态变量,其大小取决于网络的拥塞程度

兰亭风雨的专栏 1万+

Linux Component概述和高通component的使用

为了让subsystem按照一定顺序初始化设备才提出来的。subsystem中由很多设备模块,内核加载这些模块的时间不确定。子系统内有些模块是需要依赖其它模块先初始化才能进行自己初始化工作(例如v4l2 subdev和v4l2 video device),这时就要用到component框架。例如v4l2 subdev和v4l2 video device中,谁依赖谁先创建?

lz_1990的专栏 1610

Tree: Height/Depth/Level

Tree: Height/Depth/LevelTree: Height/Depth/LevelHeight110.Balanced Binary TreeDepth104. Maximum Depth of Binary Tree111. Minimum Depth of Binary TreeLevel102. Binary Tree Level Order Traversal Tree: Height/Depth/Level Height Height of node: The height o

AlfredaYu的博客 1288

SAP PS模块预算控制实战:为什么你的采购订单金额和预算占用对不上?

本文深入解析SAP PS模块中采购订单金额与预算占用偏差的常见问题,揭示承诺成本与实际成本的分流处理机制。通过实战案例和六步定位法,提供发票拆分、跨年度预算等典型场景的解决方案,并分享预防性配置框架和最佳实践,帮助企业有效控制预算偏差。

weixin_30363981的博客 515

树的高度和深度,节点的高度和深度

树的高度是从根节点到叶子节点的最长路径上的边数。树的高度是树中所有节点的高度中的最大值。树高是从根节点到最深的叶子节点的最长路径的长度。在这个例子中是 3。节点的高度是从该节点到其最深的叶子节点的最长路径的长度。例如,节点A的高度是 3,节点B的高度是 2。节点的深度是从根节点到该节点的路径长度。例如,节点A的深度是 0,节点B的深度是 1。

冷雪言的博客 5477

SAP-ABAP:SAP中如何查看系统表之间的关联关系?

在业务逻辑开发或者ALV开发过程中,我们通常要从系统中找出几个标准表之间的关联关系,有的是head与item,通过外键进行关联的关系。那么怎么去找到呢?以上就是具体如何产看系统表之间的关联关系的步骤,对于不同代码的业务顾问,也是必须要掌握的。

LinkStar的博客 2430

手把手教你学Simulink——基于Simulink的CLLC谐振变换器双向对称控制

本文介绍了一种基于Simulink的CLLC谐振变换器双向对称控制方法。针对CLLC拓扑的多阶谐振特性,采用固定频率、50%占空比、仅调节相位差的对称控制策略,实现了宽电压范围调节和全负载ZVS软开关。详细阐述了Simulink建模步骤,包括功率级搭建、相位差生成逻辑和双向切换实现,并通过仿真验证了稳态性能和双向无缝切换能力。该方法解决了传统PFM控制的不足,具有控制简单、效率高、易于工程实现的优势,适用于车载充电和储能系统等双向功率应用场景。

MHD0815的博客 302

数据结构基础攻略——树(Tree)

1.基本概念 1)树中结点的最大层次称为树的深度(Depth)或高度。 2)结点拥有的子树树称为结点的度(Degree);度为0的结点称为叶结点(Leaf)或终端结点;度不为0的结点称为非终端结点或分支结点。树的度是树内各结点的度的最大值。 3)从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径长度;树的路径长度就是从树根到每一结点的路径长度之和。 4)若

Michael_JH的专栏 868

42、使用mmrotate中k3det进行旋转目标检测,并进行mnn部署和ncnn部署

基本思想:仍然是身份证分割,并进行ncnn和mnn的c++的部署开发

sxj731533730 5710

数据结构与算法-树、二叉树与BST

对于BST而言,插入一个节点主要是要保持其“小-中-大”的逻辑不变,因此插入的节点的逻辑可以从根节点开始,一步步寻找新节点的“最终归宿”,比如在如下BST中,要插入新节点16,最终应该插入到节点17的左孩子处。由于在顺序存储,数据元素之间的逻辑关系是用物理位置来表达的,而二叉树中每一个节点都有一个对应的标号,因此可以使用标号来作为数组的下标,但除非是完美或者完全二叉树,否则会浪费存储空间,如下图所所示。其中8是根节点,14是10的右孩子(因为二叉树是有序树,因此严格区分左右),而13则是14的左孩子。

m0_74147998的博客 962

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数据结构与算法——树与二叉树

树型结构是一类重要的非线性数据结构,其中以树和二叉树最为常用,直观来看,树是以分支关系定义的层次结构。树型结构在客观世界中广泛存在,比如人类社会中的祖辈关系,社会机构组织等等都可以用树来形象表示。树型结构在计算机领域中也得到了广泛应用。

小田是个程序员的博客欢迎你的到来呀~ 2320

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【数据结构与算法】树与二叉树

如果树中的结点数为0,则称为空树。如果树中的结点数大于0,则有且仅有一个特定的结点称为根结点。其余结点可以分为m(m>0)个互不相交的有限集合T1, T2, T3, …, Tm,每个集合又是一棵树,称为根结点的子树(SubTree)。树是n个结点的有限集合。树是一种非线性结构结点之间存在分支关系,层次关系。因为任何一棵树都可以被分为根+N棵子树(N>=0)构成(子树又是由根和子树构成),所以树是递归定义的。树与非树子树是互不相交的除了根节点以外,每个节点有且只有一个父节点。

2301_79279099的博客 1418

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

数据结构与算法--线索二叉树与哈夫曼树

/ 标记枚举类型,Link表示指向孩子,Thread表示线索char data;// 结点数据域// 左右标记域// 左右孩子或线索// 定义线索二叉树结点类型哈夫曼树(最优二叉树)是带权路径长度WPL最小的二叉树。结点的权:将树中结点赋予一个有某种意义的数值。

wumingzei的博客 1108

数据结构与算法---树与二叉树

数据结构与算法---树与二叉树

Karen00000的博客 1057

《数据结构与算法-Python语言描述》读书笔记(6)第6章二叉树和树(关键词:数据结构/算法/Python/二叉树/树)

写在前面:根据韩浩画的重点,现阶段,树、图以了解逻辑结构、存储方式为主,暂时不要求代码实现。第6章 二叉树和树6.1 二叉树:概念和性质6.1.1 概念和性质定义和图示几个基本概念一个结点的子结点个数称为该结点的度数。在二叉树里有些结点的两颗子树都空,没有子结点。这种结点称为树叶(结点)。路径,结点的层和树的高度二叉树的性质满二叉树,扩充二叉树完全二叉树6.1.2 抽象数据类型6.1.3 遍历二叉树

Henry1991back的博客 876

【数据结构】树与二叉树、树与森林部分习题与算法设计例题

【数据结构】树与二叉树、树与森林部分习题与算法设计例题

ChenZHIHAO_y的博客 2411

【算法与数据结构笔记】二.树与二叉树

树是由n(n≥0)个结点组成的有穷集合(不妨用符号D来表示这个集合)与在D上关系的集合R构成的结构,记为T。当n=0时,成为空树。二叉树是n(n≥0)个结点的有穷集合D与D上的关系集合R构成的结构。注:二叉树是有序树,在二叉树中严格区分结点的左右孩子,次序不能随意颠倒,否则就变成另一棵二叉树,如下图所示,这是两棵不同的树。

计算机科研杂货铺 1382

数据结构与算法——树与二叉树篇详解

树型结构是一类重要的非线性结构。树型结构是结点之间有分支,并且具有层次关系的结构,它非常类似于自然界中的树。树结构在客观世界国是大量存在的,例如家谱、行政组织机构都可用树形象地表示。树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结构;在数据库系统中,可用树来组织信息;在分析算法的行为时,可用树来描述其执行过程。

♚焕蓝·未来的博客 5787

【数据结构】树与二叉树、树与森林部分习题以及算法设计例题 2

【数据结构】树与二叉树、树与森林部分习题与算法设计例题 2

ChenZHIHAO_y的博客 3012

数据结构与算法--5.树与二叉树

树与二叉树

m0_67940857的博客 479

python数据结构 树_【数据结构与算法】树与二叉树(Python)

树是一类重要的非线性数据结构,是以分支关系定义的层次结构定义:树(tree)是n(n>0)个结点的有限集T,其中: 有且仅有一个特定的结点,称为树的根(root)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,……Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree)特点: 树中至少有一个结点——根 树中各子树是互不相交的集合基本术语结点(node)——表示树中的元...

weixin_39718173的博客 115
上一篇: zookeeper之ZkClient使用
下一篇: Mysql事务
给自己加加油
博客等级 码龄8年 302粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值