23.二叉树基础(一)

二叉树,二叉排序树中的27 31 40 65 91 13 10 17 23 19 在2018年下半年 上午的基础知识考试中,有一题如下: 可以构造出下图所示二叉排序树(二叉检索树、二叉查找树)的关键码序列是 A 、10 13 17 19 23 27 31 40 65 91 B、23 40 91 17 19 10 31 65 27 13 C、23 19 40 27 17 13 10 91 65 31 D、27 31 40 65 91 13 10 17 23 ... 阅读详情

树

如下图:

在这里插入图片描述

基本概念

​ A 为 B 父节点, B为A的子节点

​ B,C,D父节点为同一个,他们成为兄弟节点

​ 根节点:没有父节点的节点,比如E

​ 叶子节点(叶节点):没有子节点的节点,比如GHIJ

在这里插入图片描述

高度

在这里插入图片描述

高度,从下往上看,比如第一层楼高,第二层楼高。计数从0开始。

深度

深度,从上往下看,比如水的深度。计数从0开始。

层

层,与深度类似,只不过从1开始。

二叉树(Binary Tree)

​ 每个节点,最多有两个”叉“,也就是两个子节点,分别是左子节点和右子节点。并不要求都有两个子节点,可以只有一个左子节点或者只有一个右子节点。

在这里插入图片描述

满二叉树

​ 上图编号2中,除叶子节点外,每个节点都有左右两个子节点,这种树叫满二叉树。

完全二叉树

​ 上图编号3中,有以下三个特点:

  • 叶子节点都在最底下两层

  • 最后一层的叶子节点都靠左排列(如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则就不是完全二叉树)

  • 除了最后一层,其他层的节点个数都要达到最大

    在这里插入图片描述

存储二叉树

链式存储: 基于链表

在这里插入图片描述

顺序存储:基于数组

​ 根节点放于下标i=1的位置,那么左子节点位置为2*i, 右子节点位置为2*i+1,

反过来,节点为i, 则,父节点的位置为 i/2, 完全二叉树,为便于理解,一般从下标为1开始,浪费了

一个而空间。

在这里插入图片描述

而,非完全二叉树,浪费的空则较多:

在这里插入图片描述

比较

  • 链式储存法,需要保存左右两个子节点的指针位置,多一些空间
  • 顺序存储,如果不是完全二叉树,会浪费角度的空间
  • 数组与链表的区别:
    • 数组对cpu友好
    • 数组随机访问快,空间占用少,但是需要连续内存

二叉树的遍历

为什么分三种遍历?个人思考是,有些数据存储是有序的,比如平衡二叉树,通过中序遍历,就能得到从小到大的有序数据。

在这里插入图片描述

前序遍历

概念

​ 根节点 -> 左子节点 -> 右子节点

代码

​ 采用递归: 递归三条件:

  • 问题可分解为子问题

  • 子问题的求解方法与父问题一致,只是数据规模不同而已

  • 存在终止条件

    写出递归代码步骤:

    • 大问题化为小问题,屏蔽嵌套逻辑,从某一层开始
    • 写出递推公式
    • 找到终止条件
    • 翻译成代码
    /**
         *      a
         *   b     c
         * d  e  f  g
         * 前序遍历: m -> l -> r.
         * 递推公式:print(r) -> printOrder(r.left) -> printOrder(r.right)
         * 终止条件:节点为叶子节点(getLeft == null && getRight == null). 只打印自己.
         *  a->b->d->e->c->f->g
         *
         *  复杂度:一个节点,最多两次(第一次遍历算一次;递归回来,算一次)
         *    最好:O(n)
         *    最坏:O(n)
         *    平均:O(n)
         * @param root
         */
        public static void before(Node root) {
            if(root == null) {
                return;
            }
            System.out.print(root);
            before(root.getLeft());
            before(root.getRight());
    
            // or
    
    //        if(root != null) {
    //            System.out.print(root);
    //        }
    //
    //        if(root.getLeft() == null && root.getRight() == null) {
    //            return;
    //        }
    //
    //        before(root.getLeft());
    //        before(root.getRight());
        }
    
    
    @Data
        @NoArgsConstructor
        @AllArgsConstructor
        private static class Node {
            private String data;
            private Node left;
            private Node right;
    
            public Node(String data) {
                this.data = data;
            }
    
            @Override
            public String toString() {
                return data + "->";
            }
        }
    

中序遍历

概念

​ 左子节点 -> 根节点 -> 右子节点

代码
/**
     *      a
     *   b     c
     * d  e  f  g
     * 中序遍历: l -> m -> r.
     * 递推公式:printOrder(r.left) -> print(r)-> printOrder(r.right)
     * 终止条件:节点为叶子节点(getLeft == null && getRight == null). 只打印自己.
     *  d->b->e->a->f->c->g
     *
     *  复杂度:一个节点,最多两次(第一次遍历算一次;递归回来,算一次)
     *    最好:O(n)
     *    最坏:O(n)
     *    平均:O(n)
     * @param root
     */
    public static void middle(Node root) {
        if (root == null) {
            return;
        }

        middle(root.getLeft());
        System.out.print(root);
        middle(root.getRight());
    }

后序遍历

概念

​ 左子节点 -> 右子节点 -> 根节点

代码
/**
     *      a
     *   b     c
     * d  e  f  g
     * 后序遍历: l -> r -> m.
     * 递推公式:printOrder(r.left) -> printOrder(r.right) -> print(r)
     * 终止条件:节点为叶子节点(getLeft == null && getRight == null). 只打印自己.
     * d->e->b->f->g->c->a
     *
     * 复杂度:一个节点,最多两次(第一次遍历算一次;递归回来,算一次)
     *    最好:O(n)
     *    最坏:O(n)
     *    平均:O(n)
     * @param root
     */
    public static void after(Node root) {
        if (root == null) {
            return;
        }

        after(root.getLeft());
        after(root.getRight());
        System.out.print(root);
    }
【数据结构】基础二叉树、真二叉树、满二叉树、完全二叉树、二叉树的遍历 树的介绍 简单的看一下树形结构: 生活中的树形结构: 树(Tree)的基本概念 节点:上面的树形结构,是由若干个节点和节点之间,连接起来构成的结构,ABCDEFGH都是一个单独的节点。最上面的节点成为根节点。 根节点:根节点是树层次结构中的最高节点。换句话说,根节点是没有任何父节点的节点。 父节点和子节点:上面的B节点就是E和F节点的父节点,E和F节点就是B节点的子节点。 兄弟节点:拥有相同父节点的节点称为兄弟节点,例如 E和F节点拥有相同的父节点B,所以两者称为兄弟节点。反之 E和G节点没有相同的 阅读详情

相关推荐

【数据结构】第4周 二叉树基础

/&&&&&78*********^%$#@#$%^$%# 这题没什么可说的,虽然简单,但是折腾了我一阵。 我一开始用指针写的,交上去runtime error 改了好久都不行。然后喵呜要我用结构体数组实现二叉树。 写好后交上去还是WA了,折腾好一阵才AC。 总结:以后二叉树定义的时候除了左右儿子的指针还有父母的指针的话,交换两个非祖先关系的子树要特别注意啊 很容易出错,而且你

cccrown的专栏 1468

软考知识点:二叉树的关键码序列 解析

题型: 解析:首先要理解什么是二叉树?什么是有序二叉树? 二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。 有序二叉树,就是左子树上的数值小于树根上的值,树根的值小于右子树的值。 到这里理解清楚有序二叉树后就能快速的解决此类题目了。 根据题目中的二叉树图可知, ①根节点为23,因此就可以排除选项中不..

Tjmies的博客 2万+

树和二叉树(一)

文章目录树的定义结点的定义树的其它概念二叉树的定义满二叉树完全二叉树二叉树的性质性质1性质2性质3性质4性质5二叉树的存储结构二叉树的顺序存储结构二叉树的链式存储结构 本篇文章将讲解树和二叉树,因为树和二叉树涉及的内容较多,我将这些内容分为几篇文章来讲解。 树的定义 先看看树的官方定义: 树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来...

。。。 4251

7.3 数据结构——二叉排序树

二叉排序树

weixin_45523296的博客 4500

Nornir自动化简单介绍-网络设备信息收集

作为网工,学会通过执行脚本,可以自动化的完成日常一些设备相关配置或信息收集等工作,可以说是事半功倍。 Nornir就是这样一个自动化网络运维工具。按照官网上的说明: Nornir是用python编写的自动化框架,可与python一起使用。Nornir旨在通过提供一个纯Python框架来解决这些问题。 详细参考: Github GitHub - nornir-automation/nornir: Pluggable multi-threaded framework with inventory .

Gun&rose 7805

GD32_ADC采样+DMA多通道扫描传输

所使用的MCU 片上集成了 12 位逐次逼近式模数转换器模块(ADC),可以采样来自于 16 个外部通道和 2 个内部通道上的模拟信号。这 18 个 ADC 采样通道都支持多种运行模式,采样转换后,转换结果可以按照最低有效位对齐或最高有效位对齐的方式保存在相应的数据寄存器中。我们主要介绍其多通道扫描转换和DMA传输功能,在多个通道轮询采集ad数据,并使用DMA分别保存各个数据值,其能大大提高ADC的工作效率。以下为ADC 模块框图:

Yin_w的博客 8159

二叉排序树

定义 二叉排序树是一种在结点里存储数据的二叉树。一棵二又排序树或者为空,或者具有下面的性质: 其根结点保存着一个数据项(及其关键码)。 如果其左子树不空,那么其左子树的所有结点保存的(关键码)值均小于(如果不要求严格小于,也可以是“不大于")根结点保存的(关键码)值。 如果其右子树不空,那么其右子树的所有结点保存的(关犍码)值均大于它的根结点保存的(关犍码)值。 非空的左子树或右子树也是...

不吃鱼的猫的博客 4万+

生信人的一天~HIFI数据+HIC数据组装基因组

HIFI+HIC数据组装基因组!

qq_43337286的博客 9530

数据结构-二叉排序树

1.定义 二叉排序树又称为二叉查找树,它或者是一颗空树,或者有以下性质的树: 若它的左子树非空,则左子树上所有结点的值均小于根结点的值 若它的右子树非空,则右子树上所有结点的值均大于根结点的值 左、右子树本身是二叉排序树 2.查找过程 因为二叉排序树的左子树上所有结点的关键字均小于根结点的关键字,右子树上所有结点的关键字均大于根结点的关键字,所以在二叉排序树上进行查找的过程为: ...

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 8615

Remosaic 算法

在 4in1 传感器中,相邻的 4 个同色像素(如 4 个红色、绿色或蓝色像素)合并为 1 个“超级像素”,以提升低光环境下的感光能力。例如,在 RGGB 排列中,每个 2x2 的 Quad 单元需要恢复为 4 个独立的 R、Gr、Gb、B 像素1。:传感器通过硬件级 Remosaic 直接输出 4800 万像素的原始数据,每个像素独立记录颜色信息,解析力更高2。:传感器仅输出 1200 万像素数据,再通过软件算法插值放大到 4800 万像素,实际解析力无本质提升2。的原始数据转换为传统。

Damon_X的博客 3725

保姆级教程:用Docker快速部署mpromonet/webrtc-streamer实现WebRTC直播(附常见问题解决)

本文提供了一份详细的Docker部署mpromonet/webrtc-streamer的实战指南,帮助用户快速搭建WebRTC直播服务。内容涵盖从环境准备、基础部署到进阶配置与性能调优的全过程,并针对容器网络、视频流配置、跨网访问等常见问题提供了解决方案,旨在实现低延迟的流媒体传输。

dell8的博客 177

23 | 二叉树基础(上): 什么样的二叉树适合用数组来存储?

的原因。

Balance 949

SKILL 是什么?怎么做?五分钟 带你从入门到精通

skill-creator 是 Anthropic 官方开源的“元技能”——一个专门用来创建 Skill 的 Skill。你只需要用自然语言描述想要什么功能,它会自动生成。从更宏观的视角看,Skills 的出现标志着 AI 编程的一次范式转变。在传统的 AI 编程中,代码是确定性的:1 是 1,2 是 2。但到了大模型时代,代码变得不确定——你不知道模型会输出什么,不知道它会不会突然删掉几行代码。这种不确定性让很多开发者感到不安。Skills 把这套逻辑又拉了回来。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 641

别再翻了,面试二叉树看这 11 个就够了~

写在前边 数据结构与算法: 不知道你有没有这种困惑,虽然刷了很多算法题,当我去面试的时候,面试官让你手写一个算法,可能你对此算法很熟悉,知道实现思路,但是总是不知道该在什么地方写,而且很多边界条件想不全面,一紧张,代码写的乱七八糟。如果遇到没有做过的算法题,思路也不知道从何寻找。面试吃了亏之后,我就慢慢的做出总结,开始分类的把数据结构所有的题型和解题思路每周刷题做出的系统性总结写在了 Github...

小鹿动画学编程 12万+

适航文章汇总:知识体系全面梳理

无论您是行业新手还是经验丰富的专业人士,都可以通过本篇文章快速查找相关资料,提高对适航认证、机载系统、软件及硬件等领域的理解。本部分详细解析ARP 4754A、ARP 4761、DO-178C、DO-254等核心标准,并介绍其在机载系统开发中的应用。介绍FAA、EASA、CCAR等主要航空管理机构的适航规章体系,并说明各类飞行器(如固定翼、旋翼机、无人机等)的适航要求。本部分还探讨硬件设计、验证与确认过程中的挑战。从系统架构设计到机载设备的集成与管理,本部分介绍机载系统的研发体系及适航管理的最佳实践。

qq_41854911的博客 1451

最新2026年《网络数据安全风险评估办法》条款解读

大型企业集团IT变革下的零信任安全体系建设方案(55页).pptx。以数据安全为核心的安全立体防御体系解决方案(41页).pptx。让数据安全合规地创造价值(15页 PPT).pptx。大型集团数据安全应急预案(57页).docx。数据安全治理与评估服务业务介绍.pptx。数据安全管理实践(17页).pptx。大数据安全架构设计方案.pptx。大数据安全规划总体方案.pptx。数据库安全综合治理方案.pptx。医疗数据安全建设方案.pptx。数据安全框架规划图.pptx。数据安全治理方案.pptx。

cdfunlove的博客 47

7-23 还原二叉树

给定一棵二叉树的前序遍历序列和中序遍历序列,要求计算该二叉树的高度。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1959

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

23.二叉树

二叉树 为什么需要树这种数据结构 数组存储方式的分析 优点:通过 下标方式访问元素,速度快。对于有序数组,还可使用 二分查找提高检索速度。 缺点:如果要检索具体某个值,或者 插入值( 按一定顺序) 会整体移动,效率较低 画出操作示意图: 链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如: 插入一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也很好)。 缺点:在进行 检...

weixin_43719015的博客 208

SAP B1中文培訓教材_SDK

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

Statistics and Machine Learning Toolbox

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

算法基础——二叉树

本文介绍了树型结构和二叉树的基本概念与特性。树是一种非线性数据结构,具有层次关系,包括根节点、子节点等概念,并阐述了结点度、深度等术语。二叉树是每个节点最多有两个子树的树结构,分为满二叉树和完全二叉树两种特殊类型。文章详细讲解了二叉树的存储方式(顺序存储和链式存储)、四种遍历方法(前序、中序、后序和层序遍历),并提供了相关代码实现。最后介绍了二叉树的基本操作,包括计算节点数、叶子节点数、树高等功能的实现方法。

Genentor的博客 1078

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

二叉树基础学习

1.什么是二叉树二叉树是,它的核心特征是每个节点最多只有两个子节点,分别被称为和。一个二叉树要么是空树(没有任何节点),要么由一个子节点有严格的左右顺序,不能随意颠倒(比如某个节点的左子节点和右子节点交换后,会变成一棵不同的二叉树)。2. 二叉树的基本术语例子:这棵树的深度是,因为最远叶子节点是D,从根A到D的路径包含A、B、D三个节点。3.常见的二叉树类型满二叉树:一棵深度为 k 的二叉树,若所有非叶子节点都有两个子节点,且所有叶子节点都在同一层,则称为满二叉树。

2301_80428740的博客 1163

23 | 二叉树基础(上):什么样的二叉树适合用数组来存储?

前面我们讲的都是线性表结构,栈、队列等等。今天我们讲一种非线性表结构,树。树这种数据结构比线性表的数据结构要复杂得多,内容也比较多,所以我会分四节来讲解。 我反复强调过,带着问题学习,是最有效的学习方式之一,所以在正式的内容开始之前,我还是给你出一道思考题:二叉树有哪几种存储方式?什么样的二叉树适合用数组来存储? 带着这些问题,我们就来学习今天的内容,树! 树(Tree) 我们首先来看,什么是“树”?再完备的定义,都没有图直观。所以我在图中画了几棵“树”。你来看看,这些“树”都有什么特征? 你有没有发现

liyf2的博客 405

【数据结构】你真的学会了二叉树了吗,来做一做二叉树的算法题及选择题

二叉树相关选择题以及算法题

2301_80191662的博客 1685

23线索二叉树:中序线索二叉树的遍历&&以及线索二叉树详细总结归纳整理

T m这道题卡了我好几天 真 T m心情非常烦躁哈 看优快云上 那些人写的代码 写的不清不楚 你tama能不能写详细点啊 伪代码真的很恶心好吧? 还有那个严蔚敏的书 写的是什么乱七八糟的东西 细节也不交代清楚 看的我真的恶 心死了 艹 tama最后还不是得自己来写 真tm zhizhang连教学用书都写不好 详细点会死吗?Gross!你写不好我看nm的书呢? 首先给大家讲一下 我写代码关于空指针和野指针的问题 #include<iostream> using namesp...

Ultravioletrays的博客 3103

【leetcode刷题】23.对称二叉树——Java版

关注专栏,每天一题

公号:一条coding 1万+

算法基础 -二叉树遍历

二叉树的常见操作包括: [x] 插入:在树中插入一个新的节点,同时保持二叉树的性质。 [x] 删除:从树中删除一个节点,同时保持二叉树的性质。 [x] 搜索:在树中查找一个特定的值。 [x] 遍历:按照特定的顺序访问树中的所有节点,常见的遍历方式有: * 前序遍历:先访问根节点,然后左子树,最后右子树。 * 中序遍历:先访问左子树,然后根节点,最后右子树。 * 后序遍历:先访问左子树,然后右子树,最后根节点。 * 层序遍历:按照层次顺序访问节点,通常使用队列

Adunn的专栏 1866
上一篇: 14.散列表(下)
下一篇: 【转】【网络编程】socket、端口、进程的关系
desmond_assis
博客等级 码龄14年 33粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值