CH5-树和二叉树

2023-11-01

文章目录


20220112171655

5.1树和二叉树

20220112171835

5.1.1 树的定义

20220112171930

20220112172058

20220112172152

5.1.2基本术语

20220112172349

  • 树的深度: 树中结点的最大层次

  • 有序树: 树中结点的各子树从左至右有次序(最左边的为第一个孩子)。

  • 无序树: 树中结点的各子树无次序

20220112172642

20220112172828

5.1.3二叉树的定义

20220112172944

20220112173104

20220113103915

20220113104036

5种基本形态

20220113104141

5.2案例引入

案例1∶数据压缩问题

20220113104651

案例2︰求解表达式的值

20220113104607

5.3抽象数据类型定义

20220113104950

20220113105103

5.4二叉树的性质

性质1

20220113105345

20220113105423

性质2

20220113105658

性质3

20220113110134

两种特殊形式的二叉树

20220113110524

5.4.1满二叉树

20220113110904

20220113111023

5.4.2完全二叉树

20220113111219

20220113111432

20220113111518

20220113111720

性质4

20220113112133

20220113112250

性质5

20220113113429

20220113113556

5.5存储结构

20220113113659

5.5.1顺序

20220113113932

//二叉树顺序存储表示#define MAXTSIZE 100
Typedef TElemType SqBiTree[MAXSTIZE]
SqBiTree bt;

20220113114238

20220113114340

20220113114601

5.5.2链式

二叉链表

20220113114804

typedef struct BiNode{
    TElemType data;
	struct BiNode *lchild, *rchild;		//左右孩纸
}BiNode,*BiTree;

20220113125117

20220113130141

三叉链表

20220113130309

typedef struct TriTNode{
    TelemType data;
	struct TriTNode *lchild,*parent,*rchild;
 }TriTNode,*TriTree;

5.6遍历二叉树

20220113131507

5.6.1.遍历二叉树

20220113132612

20220113132822

20220113133000

先序遍历

20220113133107

中序遍历

20220113133240

后序遍历

20220113133328

20220113133708

20220113134241

5.6.2遍历序列

20220113134600

例题1

20220113135236

20220113135303

20220113135330

例题2

20220113140346

5.6.3算法实现

【算法1】:先序

20220113141512

Status PreOrderTraverse(BiTree T){
    if(T==NULL)	return OK;		//空二叉树
    else{
        visit(T);					//访问根结点
        PreOrderTraverse(T->lchild);//递归遍历左子树
        PreOrderTraverse(T->rchild);//递归遍历右子树
    }
}
void Pre(BiTree *T) {
    if (T!=NULL) {
        printf("%d\t",T->data);
        pre(T->lchild);
        pre(T->rchild);
    }
}

20220113142059

【算法2】:中序

20220113142401

Status InOrderTraverse(BiTree T){
    if(T==NULL) return OK;//空二叉树
    else{
        InOrderTraverse(T->lchild);//递归遍历左子树
        visit(T);//访问根结点;
        InOrderTraverse(T->rchild);//递归遍历右子树}
    }
}

【算法3】:后序

20220113143037

Status PostOrderTraverse(BiTree T){
    if(T==NULL) return OK;//空二叉树
    else{
    	PostOrderTraverse(T->lchild);//递归遍历左子树
        PostOrderTraverse(T->rchild);//递归遍历右子树
        visit(T);//访问根结点
    }
}

算法分析

20220113143423

20220113143624

20220113144238

【算法4】:中序非递归

20220113164322

Status InOrderTraverse (BiTree T) {
    BiTree p; InitStack(S); p=T;
    while(p || !StackEmpty(S)) {
    	if(p) { 
            Push(S,p);
            p = p->lchild;
        }
        else { 
            Pop(S,q); 
            printf(%c”,q->data);
            p= q->rchild;
        }
    }
    return OK;
}

【算法5】:层次遍历

20220113170345

20220113171523

typedef struct{
	BTNode data[MaxSize];	//存放队中元素
    int front,rear;		   //队头和队尾指针
} SqQueue;					//顺序循环队列类型

void LevelOrder(BTNode *b) {
    BTNode *p;	SqQueue *qu;
    InitQueue(qu);	//初始化队列
    enQueue(qu,b);	//根结点指针进入队列
    while (!QueueEmpty(qu) ) {	//队不为空,则循环
   		deQueue(qu,p);			//出队结点p
        printf("%c ", p->data); //访问结点p
        if (p->lchild!=NULL) enQueue(qu,p->lchild);	//有左孩子时将其进队
        if (p->rchild!=NULL) enQueue(qu,p->rchild); //有右孩子时将其进队
    }
}

5.6.4算法的应用

【算法6】:二叉树的建立

20220113172443

20220113172819

Status CreateBiTree(BiTree &T) {
    scanf(&ch); 	//cin> >ch;
    if (ch== “#”) T = NULL;
    else {
    	if (!(T =(BiTNode *)malloc(sizeof(BiTNode))))
    		exit(OVERFLOW);	//T=new BiTNode;
        T->data = ch;	   	//生成根结点
        CreateBiTree(T->lchild);//构造左子树
        CreateBiTree(T->rchild);//构造右子树
    }
    return OK;
}// CreateBiTree

【算法7】:复制二叉树

20220113173950

int Copy(BiTree T,BiTree &NewT){
    if(T==NULL){//如果是空树返回0
    	NewT=NULL;return 0;
    }
    else {
        NewT=new BiTNode;
        NewT->data=T->data;
        Copy(T->lChild,NewT->lchild);
        Copy(T->rChild,NewT->rchild);
    } 
}

【算法8】:计算二叉树深度20220113185653

int Depth( BiTree T){
    if(T==NULL)	  return O;//如果是空树返回0
    else {
   		m=Depth(T->lChild);
        n =Depth(T->rChild);
        if(m>n)   return (m+1);
        else   return(n+1);
    }
}

【算法9】:计算二叉树结点总数

20220113190106

int NodeCount(BiTree T){
    if(T == NULL)
    	return O;
    else
    	return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}

【算法10】:计算二叉树叶子结点总数

20220113190328

int LeadCount(BiTree T){
    if(T==NULL)		//如果是空树返回0
    	return O;
    if (T->lchild == NULL && T->rchild == NULL)
    	return 1;	//如果是叶子结点返回1
    else
    	return LeafCount(T- >lchild) +LeafCount(T->rchild);
    }

5.7线索二叉树

20220114065601

20220114065901

20220114070203

20220114070327

typedef struct BiThrNode{
    int data;
    int Itag, rtag;
    struct BiThrNode *Ichild,rchild;
}BiThrNode,*BiThrTree ;

20220114070624

20220114070932

20220114071017

20220114071137

20220114071435

5.8树和森林

20220114071831

5.8.1双亲表示法

20220114072504

20220114075406

typedef struct PTNode {
    TElemType data;
	int parent;		//双亲位置域
}PTNode;

#define MAX_TREE_SIZE 100
typedef struct {
	PTNode nodes[MAX_TREE_SIZE];
    int r, n;		//根结点的位置和结点个数
}PTree;

5.8.2孩子链表

20220114111213

20220114081026

typedef struct CTNode {
	int child;
	struct CTNode *next;
}*ChildPtr;

typedef struct {
	TElemType	data;
    ChildPtr firstchild;//孩子链表头指针
}CTBox;

typedef struct {
	CTBox nodes[MAX_TREE_SIZE];
    int n, r;//结点数和根结点的位置
}CTree;

5.8.3孩子兄弟表示法

20220114114609

typedef struct CSNode{
	ElemType data;
	struct CSNode *firstchild, *nextsibling;
}CSNode,*CSTree;

20220114115030

5.8.4树与二叉树的转换

20220114115751

20220114115722

20220114120042

20220114120207

20220114120309

20220114120452

5.8.5森林与二叉树的转化

20220114120628

20220114120730

20220114120809

20220114120859

5.8.6树与森林的遍历

20220114121129

20220114121330

先序

20220114121454

中序

20220114121525

20220114121722

5.9哈夫曼树及其应用

5.9.1基本概念

20220114122615

20220114123241

20220114123346

20220114123829

20220114123952

20220114124203

20220114130854

20220114131010

20220114131128

5.9.2构造算法

20220114131310

20220114131501

20220114134614

20220114135318

20220114140702

5.9.3算法实现

20220114141239

20220114144957

20220114204339

typedef struct {
    int weight;
	int parent, lch, rch;
}HTNode,*HuffmanTree;

void CreatHuffmanTree (HuffmanTree HT, int n){//构造哈夫曼树——哈夫曼算法
    if(n<=1)	return;
	m=2*n-1;			//数组共2n-1个元素
	HT=new HTNode[m+1]; //0号单元未用,HT[m]表示根结点
    for(i=1;i<=m;++i){  //将2n-1个元素的lch、rch、parent置为0
		HT[i].Ich=O; HT[i].rch=O; HT[i].parent=O;
	}
	for(i=1;i<=n;++i) cin>>HT[i].weight;//输入前n个元素的weight值
    //初始化结束,下面开始建立哈夫曼树
	for( i=n+1;i<=m; i++){				//合并产生n-1个结点-构造Huffman树
    	Select(HT, i-1,s1, s2);			//在HT[k](1≤k≤i-1)中选择两个其双亲域为0,
    									//且权值最小的结点,并返回它们在HT中的序号s1和s2
    HT[s1].parent=i; HT[s2].parent=i;	//表示从F中删除s1,s2
    HT[i].lch=s1; HT[i].rch=s2 ;
    //s1,s2分别作为i的左右孩子
    HT[i].weight=HT[s1].weight + HT[s2].weight;//i的权值为左右孩子权值之和
    }
}

20220114165721

5.9.4哈夫曼编码

20220114205139

20220114205608

20220114205801

20220114210845

20220114211015

20220114211049

20220114211139

20220114212440

void CreatHuffmanCode(HuffmanTree HT, HuffmanCode &HC, int n){
    //从叶子到根逆向求每个字符的哈夫曼编码,存储在编码表HC中
    HC=new char *[n+1];		//分配n个字符编码的头指针矢量
    cd=new char [n];		//分配临时存放编码的动态数组空间
    cd[n-1]=1O’;			//编码结束符
    for(i=1; i<=n; ++i){	//逐个字符求哈夫曼编码
        start=n-1; c=i; f=HT[i].parent;
        while(f!=O){		//从叶子结点开始向上回溯,直到根结点
            --start;			//回溯一次start向前指一个位置
            if (HT[f].Ilchild= =c)    cd[start]= '0; //结点c是f的左孩子,则生成代码0
            else	cd[start]=1;	//结点c是f的右孩子,则生成代码1
            c=f; f=HT[f].parent;		//继续向上回溯
        }								//求出第i个字符的编码
        HC[i]= new char [n-start];		//为第i个字符串编码分配空间
        strcpy(HC[i],&cd[start]);		//将求得的编码从临时空间cd复制到HC的当前行中
    }
    delete cd;							//释放临时空间
}// CreatHuffanCode

5.9.5文件的编码和解码

20220114213446

20220114215557

20220114215616

20220114215734

20220114215853

1; i<=n; ++i){ //逐个字符求哈夫曼编码
start=n-1; c=i; f=HT[i].parent;
while(f!=O){ //从叶子结点开始向上回溯,直到根结点
–start; //回溯一次start向前指一个位置
if (HT[f].Ilchild= =c) cd[start]= '0’ ; //结点c是f的左孩子,则生成代码0
else cd[start]= ‘1’ ; //结点c是f的右孩子,则生成代码1
c=f; f=HT[f].parent; //继续向上回溯
} //求出第i个字符的编码
HC[i]= new char [n-start]; //为第i个字符串编码分配空间
strcpy(HC[i],&cd[start]); //将求得的编码从临时空间cd复制到HC的当前行中
}
delete cd; //释放临时空间
}// CreatHuffanCode




## 5.9.5文件的编码和解码

[外链图片转存中...(img-Eb60AhkD-1642168867104)]

[外链图片转存中...(img-ATRnHMgF-1642168867104)]

[外链图片转存中...(img-eWwpUqqr-1642168867105)]



[外链图片转存中...(img-JBLQcu4n-1642168867105)]

[外链图片转存中...(img-Uj4RLzFp-1642168867105)]



































本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CH5-树和二叉树 的相关文章

  • 八大排序(插入排序 | 选择排序 | 冒泡排序)

    在我们内存中我们一般会有一些没有顺序的数据 我们成为内排序 而今天分享八大排序的是时间复杂度为O N 2 的插入排序 选择排序和教学意义比较强的冒泡排序 插入排序 这是插入排序的动图 通过动图我们也是可以看到我们的插入排序的思想 从当前的位
  • 【数据结构入门精讲 | 第二篇】一文讲清算法复杂度

    上篇文章中我们引入了算法 数据结构 数据类型等概念 而要想衡量一个算法与数据结构是否为优质的 就需要一个衡量标准 这个衡量标准也是在我们实现一个好的算法时要遵循的原则 目录 基本概念 渐进性态 渐进性态数学表征 算法复杂度的运算 顺序搜索算
  • 【C++】手撕string思路梳理

    目录 基本思路 代码实现 1 构建框架 2 构建函数重载 3 迭代器 4 遍历string 5 resetve 开空间 insert任意位置插入push back append 按顺序依次实现 6 erase删除 clear清除 resiz
  • 【数据结构】单链表的定义和操作

    目录 1 单链表的定义 2 单链表的创建和初始化 3 单链表的插入节点操作 4 单链表的删除节点操作 5 单链表的查找节点操作 6 单链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • DS八大排序之冒泡排序和快速排序

    前言 前两期我们已经对 插入排序 直接插入排序和希尔排序 和 选择排序 直接选择排序和堆排序 进行了详细的介绍 这一期我们再来详细介绍一组排序 交换排序 即耳熟能详的冒泡排序和赫赫有名的快速排序 本期内容介绍 冒泡排序 快速排序 Hoare
  • 代码随想录算法训练营Day3 | 203.移除链表元素、707.设计链表、59.螺旋矩阵II

    LeetCode 203 移除链表元素 本题思路 就是常规的移除链表中的元素的操作 需要注意的点 头节点 head val val 的情况的处理 如果 head val val 就要继续往后 head head next 因此我们要遍历到第
  • LeetCode21. Merge Two Sorted Lists

    文章目录 一 题目 二 题解 一 题目 You are given the heads of two sorted linked lists list1 and list2 Merge the two lists into one sort
  • 回溯算法第零篇【递归、搜索与回溯】【回溯算法入门必看】

    本篇文章的目的 1 给小伙伴们对回溯算法中的名词进行解释 2 消除递归的恐惧 回溯是递归的一个分支 给小伙伴们一个建议 整篇文章都要看完 一字不漏 全是干货 注意 分析回溯的思想之前 我们得知道一个关系 递归包含搜索 搜索包含回溯 所以我们
  • 【数据结构和算法】 K 和数对的最大数目

    其他系列文章导航 Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一 题目描述 二 题解 2 1 方法一 双指针排序 三 代码 3 1 方法一 双指针排序 3
  • 数据结构算法-快速排序

    核心思路 快速排序算法核心思路 选择一个 基准 元素 将数组分为两个子数组 一个包含比基准小的元素 另一个包含比基准大的元素 然后对这两个子数组进行递归排序 基准数 初始化两个索引 i 和 j 分别子数组的开头和结尾 初始化基准元素 bas
  • 代码随想录算法训练营第42天| ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

    416 分割等和子集 已解答 中等 相关标签 相关企业 给你一个 只包含正整数 的 非空 数组 nums 请你判断是否可以将这个数组分割成两个子集 使得两个子集的元素和相等 示例 1 输入 nums 1 5 11 5 输出 true 解释
  • 数据结构学习笔记(七)搜索结构

    文章目录 1 前言 2 概念 3 静态搜索结构 3 1 静态搜索表 3 2 顺序搜索表 3 2 1 基于有序顺序表和顺序搜索和折半搜索 4 二叉搜索树
  • 冒泡排序/选择排序/插入排序/快速排序/归并排序/桶排序/堆排序/希尔排序/计数排序/基数排序/二分查找/广度优先搜索/深度优先搜索

    排序算法 冒泡排序 Bubble Sort 通过重复地比较相邻的元素并交换它们 使得最大 或最小 的元素逐渐移动到列表的一端 从而实现排序 选择排序 Selection Sort 在未排序的部分中 选择最小 或最大 的元素 并将其放置在已排
  • Leetcode 45 跳跃游戏 II

    题意理解 给定一个长度为 n 的 0 索引 整数数组 nums 初始位置为 nums 0 每个元素 nums i 表示从索引 i 向前跳转的最大长度 还是从初始坐标i 0的位置到达最后一个元素 但是问题不是能不能跳到 而是 最少几步能跳到最
  • LeetCode 2397. 被列覆盖的最多行数,状态压缩优化回溯法

    一 题目 1 题目描述 给你一个下标从 0 开始 大小为 m x n 的二进制矩阵 matrix 另给你一个整数 numSelect 表示你必须从 matrix 中选择的 不同 列的数量 如果一行中所有的 1 都被你选中的列所覆盖 则认为这
  • 【每日一题】2397. 被列覆盖的最多行数-2024.1.4

    题目 2397 被列覆盖的最多行数 给你一个下标从 0 开始 大小为 m x n 的二进制矩阵 matrix 另给你一个整数 numSelect 表示你必须从 matrix 中选择的 不同 列的数量 如果一行中所有的 1 都被你选中的列所覆
  • 浅谈归并排序:合并 K 个升序链表的归并解法

    在面试中遇到了这道题 如何实现多个升序链表的合并 这是 LeetCode 上的一道原题 题目具体如下 用归并实现合并 K 个升序链表 LeetCode 23 合并K个升序链表 给你一个链表数组 每个链表都已经按升序排列 请你将所有链表合并到
  • 排序:计数排序

    一 概念 计数排序是非比较排序 是对哈希直接定址法的变形应用 二 思想 利用数组统计相同数据出现的次数 例如整型数据m出现n次 就在数组m位置记录数据为n 最后从头遍历数组打印数据即可 通俗来讲就是 数组下标即为数据 下标所指位置的值即为数
  • 数据结构——排序

    前言 哈喽小伙伴们好久不见 也是顺利的考完试迎来了寒假 众所周知 不怕同学是学霸 就怕学霸放寒假 假期身为弯道超车的最佳时间 我们定然是不能懒散的度过 今天我们就一起来学习数据结构初阶的终章 七大排序 本文所有的排序演示都为升序排序 目录
  • 用栈实现队列(OJ中报错的处理)

    用栈实现队列 ERROR AddressSanitizer myQueueFree函数中栈的释放处现了问题 没有调用StackDestory而是直接free了 这个是栈初始化时 capacity与malloc申请的空间大小没有匹配 请你仅使

随机推荐

  • 学习笔记:SemanticStyleGAN 面向可控图像合成和编辑的组合生成先验学习

    CVPR 2022 SemanticStyleGAN Learning Compositional Generative Priors for Controllable Image Synthesis and Editing 面向可控图像合
  • MES生产管理系统如何与ERP系统集成

    MES生产管理系统和ERP企业管理系统是制造企业信息化的重要组成部分 它们在生产管理 资源计划和业务流程等方面发挥着重要作用 实现MES与ERP系统的集成 可以更好地优化企业生产流程 提高生产效率和降低成本 本文将探讨MES管理系统解决方案
  • 区块链技术开发路线

    背景陈述 已经对区块链领域的学习研究了一段时间 总体来说 前期主要是围绕bitcoin架构及其源码学习的 但对这个领域的技术开发还是不太熟悉 为了使自己对区块链领域有一个系统的学习和技术锤炼 特此总结了如下技术开发路线 来逐渐充实自己的区块
  • 育碧2k微软服务器,2K工作室更名-2K Games,育碧,全境封锁2 ——快科技(驱动之家旗下媒体)--科技改变未来...

    2K Games旗下的 硅谷工作室 Silicon Valley Studio 现更名为 第31工会 31st Union 之所以要提到这间工作室 盖因创始人Michael Condrey之前是动视 大锤工作室联合创始人 更早以前还是EA
  • C++(一)#pragma once用法

    C 一 pragma once用法 用法 C C 中 在使用预编译指令 include的时候 为了防止重复引用造成二义性 ifndef ifndef CODE BLOCK define CODE BLOCK code endif CODE
  • Python OSError: symbol cublasLtHSHMatmulAlgoInit, version libcublasLt.so.11 not defined的解决

    问题与排查 原报错信息如下 OSError opt conda lib python3 8 site packages nvidia cublas lib libcublas so 11 symbol cublasLtHSHMatmulAl
  • 动态创建class

    需要引入命名空间 using System CodeDom using System CodeDom Compiler using Microsoft CSharp using System Reflection public static
  • ASP.NET中文显示乱码之解决方法

    ASP NET很灵活 这归功于它采用文本文件方式的配置方式 另外的那种用页面标识符的方法应该是从ASP延续下来的 写ASP 程序时候碰到中文显示问题 运行后发现ASP 从数据库中读出来的中文全部变成了 解决办法 方法一 在config we
  • 程序员眼中的流量卡:需求、选择与使用

    标题 程序员眼中的流量卡 需求 选择与使用 一 流量卡的需求分析 作为程序员 我们深知数据流量在我们的工作中的重要性 无论是开发 测试还是部署 亦或是远程工作 都需要网络的支持 使用流量卡可以为我们提供一种灵活 便携的网络解决方案 让我们可
  • 如何用java POI在excel中画线_Java中使用POI在Excel单元格中画斜线—XLS格式

    Excel主要有xls和xlsx两种格式 两种格式对应的POI接口使用方法也不同 本节主要介绍一下 在xls格式的Excel单元格中如何画斜线 1 初始化HSSFWorkbook对象 初始化HSSFWorkbook对象 创建两行两列单元格
  • 【React】Fiber 实现可中断的渲染

    什么是可中断的 渲染 参照我们在 Concurrent 的奥秘 中的同步渲染和并发渲染的例子 上图是同步渲染过程 上图是并发渲染过程 我们可以看到明显的区别 同步渲染 就是完整地执行了一个很耗时的渲染 并发渲染 将原本耗时的 渲染 拆解成了
  • Labelme标注工具 json文件批量转化 labelme_json_to_dataset 多个版本代码集合

    文章目录 一 Labelme标注工具安装 二 json文件批量执行转化 代码1 问题一 问题二 代码2 代码3 一 Labelme标注工具安装 https github com wkentaro labelme 安装过程按照github教程
  • 1.单例模式之饿汉式

    单例模式总结 特点 构造方法私有 提供一个全局访问点 实现方式 有很多 分四篇分别总结1 饿汉式 2 懒汉式 3 注册式 4 ThreadLocal 优点 内存中只有一个实例 减少内存开销 避免对资源多重占用 设置全局访问点 严格控制访问
  • 【IDEA】IDEA 下一些 编码技巧

    1 概述 转载 这样写代码 真是帅到没有朋友 转载记录一下 防止下次找不到了
  • 操作系统(OS)

    目录 1 计算机系统层次 2 操作系统 2 1 概念 2 2 作用 1 计算机系统层次 2 操作系统 2 1 概念 任何计算机系统都包含一个基本的程序集合 称为操作系统 OS 操作系统包括 内核 进程管理 内存管理 文件管理 驱动管理 其他
  • ajax实现下拉框联动

    spring mvc bootstrap 最近在做一个新闻不发布网站 网站栏目需要实现下拉框联动 因为没有用到前端框架 因此需要自己来写 废话不多说 思路是 跳转到新闻发布页面 需要初始化一级目录 RequestMapping releas
  • 使用ODBC连接SQL Server数据库进行增删查改操作全过程

    include
  • 开发工具~nuget配置本地源

    我们在本地部署了自己的nuget服务器 有时可以需要用到nuget restore命令去恢复包包 它会从下面的nuget config里读你的配置源信息 就是在这里 我们要把内测的nuget服务器路径添加上 这样就可以了 NUGET服务配置
  • 12V输入给三节锂电池充电芯片

    12V输入3A三节锂电池充电 可用于车载给PDA MP3 MP4 数码相机 PSP游戏机 笔记本等电子数码产品充电 2A多单元高效率开关充电器 概述 HU3208A是4 0V 23V输入 2A多单元同步降压型锂离子电池充电器 适用于便携式应
  • CH5-树和二叉树

    文章目录 5 1树和二叉树 5 1 1 树的定义 5 1 2基本术语 5 1 3二叉树的定义 5种基本形态 5 2案例引入 案例1 数据压缩问题 案例2 求解表达式的值 5 3抽象数据类型定义 5 4二叉树的性质 性质1 性质2 性质3 两