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

FAGLB03余额显示异常排查与修复指南

本文针对SAP新总账中FAGLB03报表余额显示异常问题,提供了专业的排查与修复指南。文章深入剖析了数据不一致的核心原因,如FAGLFLEXT汇总表与凭证明细不同步、年度余额结转(FAGLGVTR)失败等,并详细介绍了使用FAGLF03进行精准诊断、通过SE38执行标准调整程序TFC_ADJUST_VZ进行修复的标准操作流程,帮助用户快速恢复数据一致性,确保财务报表的准确性。

weixin_29313423的博客 307

逆向学习:从已上线微信小游戏反推Cocos工程结构(以切水果跑酷为例)

本文以“切水果跑酷”为例,详细介绍了如何通过逆向分析已上线的微信小游戏,反推其基于Cocos Creator的原始工程结构。文章深入拆解了编译后的目录骨架、资源加载逻辑与依赖关系,并重点解析了微信平台API的调用特征,为开发者提供了一种高效学习游戏架构与设计模式的实用方法。

kk1234的博客 1073

二叉排序树

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

不吃鱼的猫的博客 4万+

QGIS中高效处理CAD数据的两种实用技巧

本文详细解析了在QGIS中高效处理CAD数据的两种核心方法。针对DWG/DXF文件在QGIS中直接打开失败的问题,介绍了使用QGIS内置数据导入管理器进行标准化转换的流程,并重点推荐了功能更强大的Another DXF Importer插件,以更好地保留文字、块属性等复杂信息。文章对比了两种方法的优劣与适用场景,并提供了坐标系设置、中文乱码等常见问题的避坑指南,帮助用户根据数据需求选择最佳导入策略。

weixin_28363123的博客 117

数据结构-二叉排序树

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

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

华为OD机试真题 - 矩阵匹配 牛客网

2024华为OD机试真题,代码包含语言java、js、python、c 代码基本都有详细注释。 题目描述 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式: N M K N*M矩阵 输出描述 N*M 的矩阵中可以选出 M! / N! 种组合数组,每个组合数组种第 K 大的数中的最小值。无需考虑重复数字,直接取字典排序结果即可。

2301_76543445的博客 498

GraphRAG 与 HippoRAG 深度对比:在 RAGFlow 中如何选择知识图谱方案?

本文深入对比了GraphRAG与HippoRAG在RAGFlow中的知识图谱构建方案,分析了两者在技术架构、资源消耗和场景适配性上的核心差异。GraphRAG适合需要快速响应和资源有限的场景,而HippoRAG则更适用于精确关系推理的专业领域。文章还提供了RAGFlow的演进路线和选型决策框架,帮助架构师根据实际需求做出合理选择。

weixin_27889245的博客 246

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

的原因。

Balance 949

吃透Chisel语言.02.Chisel+VS Code+Ubuntu/WSL2开发环境搭建与使用

既然是学Chisel语言,那肯定得先把环境配置好,磨刀不误砍柴工嘛。而且有个测试环境的话,在后期的学习过程中自己去试运行代码段可以加深学习效果。这里推荐使用Ubuntu或者基于WSL2(Windows Subsystem Linux 2)的Ubuntu,本人使用的是WSL2上的Ubuntu 20.04.3 LTS,在使用体验上与Ubuntu几乎没有区别,且能同时使用Windows提供的诸多便利。...

github-3rr0r的博客 8448

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

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

小鹿动画学编程 12万+

Linux下Linpack测试GPU和CPU性能

前面的文章已经介绍了如何搭建Linpack环境:https://blog.csdn.net/liu_feng_zi_/article/details/107429720 接下来说明如何使用 一、编写运行脚本: 新建文件:run_linpack.sh,内容如下: export HPL_DIR =/root/LHC/Linpack/hpl-2.0_FERMI_v15 export MKL_NUM_THREADS=6 export OMP_NUM_THREADS=6 export MKL_DYNAMI.

liu_feng_zi_的专栏 4633

华为OD机试双机位C卷:日志排序 (Py/C/C++/Java/Js/Go)

华为OD机试双机C卷真题【日志排序】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-日志排序。

qq_45776114的博客 1754

7-23 还原二叉树

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

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

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

23.二叉树

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

weixin_43719015的博客 208

廖雪峰Python教程[完整版]

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

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

算法基础——二叉树

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

Genentor的博客 1078

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

二叉树基础学习

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、付费专栏及课程。

余额充值