五、树

树的定义

  • 树的逻辑表示:树形表示法、文氏图表示法、凹入表示法、括号表示法。

  • 结点:表示树中的元素,包括数据项及若干指向其子树的分支。
  • 结点的度:结点拥有的子树树;树的度:一棵树中最大的结点度数

  • 叶子结点:度为0的结点;分支结点:度不为0的结点;孩子:结点子树的根称为该结点的孩子;双亲:孩子结点的上层结点叫该结点的双亲;兄弟:同一双亲的孩子。
  • 深度:树中结点的最大层次数。

  • 有序树:树中各结点的子树从左至右是有次序的,不能互换。否则称为无序树。

树的性质

  • 树中的结点数等于所有结点的度数加1。

  • 度为m的树中第i层上至多有mi-1 个结点(i>=1)。

二叉树的概念

  • 满二叉树:定义——一棵深度为k且具有2k-1个结点的二叉树。特点——每一层上的结点数都是最大结点数。
  • 完全二叉树:定义——深度为k,有n个结点的二叉树当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称为完全二叉树。

二叉树的性质

  • 二叉树的第i层上至多有2i-1(i>=1)个结点。
  • 深度为K的二叉树至多有2k-1个结点。
  • 对任何一棵二叉树T,如果其叶子数为n0,度为2的结点数为n2,则n0=n2+1。

  • 一个有n个结点的完全二叉树,编号最大的分支结点的编号是

  • 一个有n个结点的完全二叉树,n0的个数是不小于n/2的最小整数。

二叉树的存储结构

  • 用一组连续的存储单元存储二叉树的数据元素。在存储之前对二叉树的所有结点安排一个适当的序列,使得结点在这个序列中的相互位置能反应出结点之间的逻辑关系。

  • 特点:结点间关系蕴含在其存储位置中;浪费空间,适于存满二叉树和完全二叉树。

二叉树的链式存储结构

  • 用一个链表来存储一棵二叉树,二叉树中每一个结点用链表中的一个链结点来存储。

遍历二叉树

  • 遍历方法:

  • 利用遍历结果确定二叉树:

  • 先序遍历算法:
//先序遍历递归算法
void preorder(Tree t){if(t==null)return;visit(t);preorder(t.left());preorder(t.right());
}//先序遍历非递归算法
void PreOrderUnrec(Bitree t)
{//创建栈来存放树的结点SqStack s;StackInit(s);p=t;while (p!=null || !StackEmpty(s)){while (p!=null)             //遍历左子树{visite(p->data);push(s,p);p=p->lchild;       }//endwhileif (!StackEmpty(s))         //通过下一次循环中的内嵌while实现右子树遍历{p=pop(s);p=p->rchild;        }//endif}//endwhile }//PreOrderUnrec
中序遍历算法://中序遍历递归算法
void inorder(Tree t){if(t==null)return;inorder(t.left());visit(t);inorder(t.right());
}void InOrderUnrec(Bitree t)
{//创建栈来存放树的结点SqStack s;StackInit(s);p=t;while (p!=null || !StackEmpty(s)){while (p!=null)             //遍历左子树{push(s,p);p=p->lchild;       }//endwhileif (!StackEmpty(s))         //通过下一次循环中的内嵌while实现右子树遍历{p=pop(s);visite(p->data);        //访问根节点p=p->rchild;        }//endif}//endwhile }//InOrderUnrec
后序遍历算法:后序遍历递归算法
void inorder(Tree t){if(t==null)return;inorder(t.left());inorder(t.right());visit(t);
}//后序遍历非递归算法
对于任一结点P,将其入栈,然后沿其左子树一直往下搜索,直到搜索到没有左孩子的结点,此时该结点出现在栈顶,但是此时不能将其出栈并访问,因此其右孩子还为被访问。所以接下来按照相同的规则对其右子树进行相同的处理,当访问完其右孩子时,该结点又出现在栈顶,此时可以将其出栈并访问。这样就保证了正确的访问顺序。可以看出,在这个过程中,每个结点都两次出现在栈顶,只有在第二次出现在栈顶时,才能访问它。因此需要多设置一个变量标识该结点是否是第一次出现在栈顶。
void postOrder2(BinTree *root)    //非递归后序遍历
{stack<BTNode*> s;BinTree *p=root;BTNode *temp;while(p!=NULL||!s.empty()){while(p!=NULL)              //沿左子树一直往下搜索,直至出现没有左子树的结点 {BTNode *btn=(BTNode *)malloc(sizeof(BTNode));btn->btnode=p;btn->isFirst=true;s.push(btn);p=p->lchild;}if(!s.empty()){temp=s.top();s.pop();if(temp->isFirst==true)     //表示是第一次出现在栈顶 {temp->isFirst=false;s.push(temp);p=temp->btnode->rchild;    }else                        //第二次出现在栈顶 {cout<<temp->btnode->data<<" ";p=NULL;}}}
}

线索二叉树

  • 利用二叉链表的空指针域,建立指向该结点的前驱/后继结点的指针,方便二叉树的线性化使用。

  • 对二叉链表以某种次序遍历使其变为线索二叉树的过程叫做线索化。有先序线索二叉树、中序线索二叉树(更实用)和后序线索二叉树三种。

  • 建立中序线索二叉树

树的存储结构

  • 双亲表示法:用一组连续空间存储树的结点,每个节点包含两个域——数据域用来存放结点本身信息,双亲域用来指示本结点的双亲结点在数组中位置。

孩子表示法:采用孩子链表,每个结点的孩子结点用单链表存储,再用含n个元素的结构数组指向每个孩子链表。

  • 孩子兄弟表示法:用二叉链表作为树的存储结构。链表中结点的两个链域分为指向该结点的第一个孩子结点和下一个兄弟结点。

森林与二叉树的转换

  • 将树转换为二叉树

  • 将二叉树转换为树:

  • 森林转换成二叉树:

  • 二叉树转换成森林

哈夫曼树

  • 结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根节点到该结点之间的路径长度与该结点的权的乘积。

  • 在一棵二叉树中,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称哈夫曼树。

有帮助到你的点赞、收藏和关注一下吧

需要更多教程,微信扫码即可

数据结构知识点大汇总(五)相关推荐

  1. 数据结构知识点大汇总(七)

    七.查找 概述 查找表:由同一类型的数据元素(或记录)构成的集合. 静态查找表 静态查找是指在静态查找表上进行的查找操作,在查找表中满足条件的数据元素的存储位置或各种属性.静态查找表的查找算法主要有: ...

  2. 数据结构知识点大汇总(六)

    六.图 图的概念 图是一种较线性表和树更为复杂的数据结构,在图形结构中,结点之间关系可以是任意的,图中任意两个数据元素之间都可能相关. 有向图和无向图 若无向图中的每两个顶点之间都存在着一条边,则称该 ...

  3. 数据结构知识点大汇总(八)

    八.排序 排序概述 排序的分类:内部排序和外部排序(若待排序记录都在内存中,称为内部排序:若待排序记录一部分在内存,一部分在外存,则称为外部排序).稳定排序和不稳定排序. 内部排序的算法:插入排序(希 ...

  4. 数据结构知识点大汇总(一)

    一.数据结构绪论 数据结构的基本概念 数据结构是一门研究非数值计算的程序设计问题中,计算机的操作对象以及它们之间的关系和操作的学科. 数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和 ...

  5. 数据结构知识点大汇总(二)

    二.线性表 线性表的类型定义 线性表是n(n>0)个相同类型数据元素构成的有限序列,其中n为线性表的长度. 线性表的基本操作: 线性表的顺序表示和实现 线性表的顺序存储结构:用一组地址连续的存储 ...

  6. 数据结构知识点大汇总(三)

    三.栈和队列 栈的概念 栈是限制在表的一端进行插入和删除运算的线性表,通常称插入.删除的这一端为栈顶,另一端为栈底.当表中没有元素时成为空栈. 栈的进出顺序判断: 栈的基本操作: 顺序栈 顺序栈利用一 ...

  7. 数据结构知识点大汇总(四)

    四.数组和广义表 数组的定义 数组是我们熟悉的数据类型,数组中各元素具有统一的类型,并且数组元素的下标一般具有固定的上界和下界,因此,数组的处理比其它复杂的结构更为简单. 任何数组A都可以看作一个线性 ...

  8. 面试必会系列 - 3.1 Redis知识点大汇总(数据类型,内存模型,持久化,缓存击穿,集群,一致性哈希等等)

    本文已收录至 Github(MD-Notes),若博客中图片模糊或打不开,可以来我的 Github 仓库,包含了完整图文:https://github.com/HanquanHq/MD-Notes,涵 ...

  9. 面试必会系列 - 2.1 MySQL知识点大汇总(基本架构,存储引擎,锁,事务,索引,B+树等等)

    本文已收录至 Github(MD-Notes),若博客中图片模糊或打不开,可以来我的 Github 仓库,包含了完整图文:https://github.com/HanquanHq/MD-Notes,涵 ...

最新文章

  1. CTFshow 反序列化 web275
  2. php渲染页面简单例子,微信小程序如何渲染html内容(示例讲解)
  3. protel快捷键大全
  4. php 半角全角,PHP 全角转半角实现代码
  5. 大咖分享,带你洞悉畅销游戏背后的数字化运营落地实践
  6. Excel基础操作(二)
  7. 记一次排查线上程序内存的忽高忽低,又是大集合惹祸了
  8. spring源码编译和导入eclipse
  9. 把控站外seo效果的几个操作点
  10. ORACLE数据库事务隔离级别
  11. 聚能聊每周精选 第十一期
  12. SSD——样本正负比控制+多尺度检测 (目标检测)(one-stage)(深度学习)(ECCV 2016)
  13. 阶段3 1.Mybatis_12.Mybatis注解开发_7 Mybatis注解开发一对多的查询配置
  14. java epoll 模型_I/O多路复用技术详解之epoll模型
  15. Qt 字符编码转换(UTF-8 转换为 GBK)
  16. JAVA羽毛球篮球运动场地预约管理系统毕业设计 开题报告
  17. DB2导出 mysql导入_db2数据库导入导出数据
  18. python上的包嗅探
  19. winfows 切换 双屏_win10多个桌面切换快捷键 win10怎样设置双屏显示两个桌面
  20. Linux 系统安全检查

热门文章

  1. 摩托罗拉Edge真机谍照曝光:挖孔瀑布屏+骁龙765
  2. 支付宝2019年账单周一见 你准备好了吗?
  3. 再推新机!小米A3正式发布 售价249欧元起
  4. 一加7 Pro卖到断货 刘作虎:最快速度满足中国用户需求
  5. 拜董明珠“闺蜜”刘姝威所赐 广东证监局向美的方洪波出具警示函
  6. 29岁女程序员感慨:硕士学历,脱单比找工作买房还难,有同感么?
  7. nuxt webpack配置css,基于nuxt通过webpack配置ant-Design-vue的主题切换配置
  8. 字符串:2.BF算法(普通模式匹配算法)
  9. linux内核实验教程答案,20199310《Linux内核原理与分析》第十五周作业 Linux安全实验...
  10. mysql字段为空 不作为查询条件_Mysql基本语法知识点小结