树 二叉树 算法查找
时间:2020-04-26
本文章向大家介绍树 二叉树 算法查找,主要包括树 二叉树 算法查找使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
树 二叉树 查找算法总结
一. 思维导图
树和二叉树
查找
二. 重要概念笔记
1.树的基本操作:
(1).查找
Root(T) //求树的根结点
Value(T,cur_e) //求当前结点的元素值
Parent(T, cur_e) //求当前结点的双亲结点
LeftChild(T, cur_e) //求当前结点的最左孩子
RightSibling(T, cur_e)//求当前结点的右兄弟
TreeEmpty(T) // 判定树是否为空树
TreeDepth(T) // 求树的深度
TraverseTree( T) // 遍历
(2).插入
InitTree(&T) // 初始化置空树
CreateTree(&T, definition)// 按定义构造
Assign(T, cur_e, value) // 给当前结点赋值
InsertChild(&T, &p, i, c)// 将以c为根的树 插入为结点p的第i棵子树
(3).删除
ClearTree(&T) //将树清空
DestroyTree(&T) //销毁树的结构
DeleteChild(&T,&p,i)//删除结点p的第i个孩子
2.树最适合用来表示【元素之间具有分支层次关系的数据】。
3.树的相关性质:
(1)◼ 树中的结点数 = 所有结点的度数+1;度数之和=分支数之和;分支数=结点数-1.
(2)◼ 度为m的树中,第i层上至多有m^i-1个结点(i>=1).
4.二叉树的性质:
性质一:在二叉树的第 i 层上至多有2i-1 个结点(i≥1)
性质二:深度为 k 的二叉树上至多含 2k-1 个结 点(k≥1)
性质三:对于任何一个二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。
性质四:具有n个结点的完全二叉树的深度为[log2n] +1
性质五:对于具有n个结点的完全二叉树,如果按照从上到下从左至右的顺序对所有结点从0开始编号,则对于序号为i的结点有:
(1)若i>0,双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲结点 (2)若2i+1<n,左孩子序号:2i+1,否则无左孩子 (3)若2i+2<n,右孩子序号:2i+2,否则无右孩子
5.两类特殊的二叉树:
(1)满二叉树:
(2)完全二叉树:
6.二叉树的存储结构:
存储结构:
特点:一组地址连续的存储单元存储各结点(如一维数组);自根而下、自左而右存储结点; 按完全二叉树上的结点位置进行编号和存储。
缺点:空间利用率太低。
链式存储:
二叉链表
三叉链表
7.遍历二叉树:
先序遍历算法的递归描述:(其余随之变即可)
void Preorder (BiTree T) { //先序遍历二叉树
if (T) {
cout<<T->data; // 访问结点
Preorder(T->lchild); // 遍历左子树
Preorder(T->rchild); // 遍历右子树
}
}
8.若x是二叉中序线索树中的一个有左孩子结点,且x不为根,则x的前驱是x的左子树中的最右结点。
9.对树的访问没有中根遍历。
10.树的后根遍历与对应二叉树的中根遍历顺序是一致的。
11.二叉排序树的插入:
插入的元素一定在叶结点上,若二叉排序树为空,则插入结点应为根结点,否则,继续在其左右子树上查找。
12.删除:
被删除的结点是叶子:1)其双亲结点中相应指针域的值改为“空” 2)被删除的结点只有左子树或者只有右子树:其双亲结点的相应指针域的值改为“指向被删除结点的左子树 或右子树” 3)被删除的结点既有左子树,也有右子树:以其直接前驱(后继)替代之,然 后再删除该前驱(后继)结点。
13.二叉排序树的查找性能分析:
平均查找长度和二叉树的形态有关,即,最好:log2n 最坏:(n+1)/2(单支树)
14.对于一棵有n个结点的AVL树,其高度保持在O(log2n)数量级,ASL也保持在O(log2n)量级
15.B-树(多路平衡查找树)
m阶B-树的结点的特点:非根结点:孩子个数 至少: [m/2](向上取整)最多:m
非根结点:关键字个数:至少: [m/2] -1(向上取整) 最多:m-1 根节点至少2个孩子节点
16.B-树的查找:
查到某个叶结点,若相应指针为空,落入一个外部节点,表示查找失败
17.B-树的插入:
在查找不成功之后,需进行插入。关键字插入的位置必定在叶子结点层,有下列几种情况:插入后,该结点的关键字个数n<m-1,不修改指针;插入后,该结点的关键字个数 n=m-1,则需进行"结点分裂“。
18.B+树的查找:
直接从最小关键字开始进行顺序查找所有叶节点链接成的线性链表。从B+树的根节点出发一直找到叶节点为止。
三.疑难问题及解决方法
问题:平衡二叉树的构造, 解决方法:多做题,回看课堂视频。
原文地址:https://www.cnblogs.com/zghh/p/12769215.html
- 并发与实例上下文模式: WCF服务在不同实例上下文模式下具有怎样的并发表现
- 区块链将变革的五个行业
- WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[上篇]
- AngularJS in Action读书笔记3——走近Services
- 有了这些无人驾驶的汽车,未来还需要考驾照吗?
- 并发与实例上下文模式: WCF服务在不同实例上下文模式下具有怎样的并发表现
- AngularJS in Action读书笔记4(实战篇)——创建Statistic模块
- Effective Deep Memory Networks for Relation Extraction
- ConcurrencyMode.Multiple模式下的WCF服务就一定是并发执行的吗:探讨同步上下文对并发的影响[上篇]
- WCF技术剖析之二十一:WCF基本异常处理模式[下篇]
- AngularJS in Action读书笔记5(实战篇)——在directive中引入D3饼状图显示
- WCF中并发(Concurrency)与限流(Throttling)体系深入解析系列[共7篇]
- AngularJS in Action读书笔记6(实战篇)——bug hunting
- FreeMarker模板开发指南知识点梳理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 疯子的算法总结(五) 矩阵乘法 (矩阵快速幂)
- codeforce 227D Naughty Stone Piles (贪心+递归+递推)
- POJ3614防晒霜 这个贪心有点东西(贪心+优先队列)
- 环形均分纸牌问题(中位数)
- POJ 1176 Party Lamps&& USACO 2.2 派对灯(搜索)
- P1522 牛的旅行 Cow Tours(floyd)
- P1468 派对灯 Party Lamps(BIG 模拟)
- 【JVM系统学习之路系列】 JVM 概述篇
- P1518 两只塔姆沃斯牛 The Tamworth Two(简单的搜索题)
- P1466 集合 Subset Sums 搜索+递推+背包三种做法
- P1465 序言页码 Preface Numbering (手推)
- P1460 健康的荷斯坦奶牛 Healthy Holsteins (简单的dfs)
- P1459 三值的排序 Sorting a Three-Valued
- P1457 城堡 The Castle 位运算+BFS+思维(难题,好题)
- PostgreSQL异常宕机重启时间超长