树、二叉树(二)

限于篇幅过长上一篇我们只谈了树、二叉树(一)比较基础的认识,下面我们深入的学习树与二叉树。

顺序存储结构

使用一组地址(一维数组)连续的存储单元来存储数据元素


    //-------二叉树的顺序存储表示---------
    #define MAXTSIZE 100  //二叉树的最大结点数
    typedef TElemType SqBiTree[MAXTSIZE];
    SqBiTree bt;

完全二叉树:只需要从根起按层序存储,依次自上而下、自左至右存储结点元素,即将完全二叉树上编号为i的结点元素存储在如上定义的一维数组中下标为i-1的分量中。

一般二叉树:一般二叉树同样要遵循完全二叉树的规则,将结点进行相对照,存储在一维数组的相对应分量中。

顺序存储的优点与缺点

  1. 对于完全二叉树来说,顺序存储结构既简单又节约存储空间。
  2. 一般的二叉树采取顺序存储结构时,虽然简单,但容易造成存储空间的浪费。
  3. 在顺序存储的二叉树做插入和删除结点时,要大量移动结点。

链式存储结构

对照上面顺序存储结构的不足,我们引入了链式存储,二叉树的结点至少有三个域:数据域、左、右指针域。有时候我们还要知道它的双亲,所以还要加上一个指向双亲结点的指针域。

//----二叉树的二叉链表存储表示---
typedef struct BiTNode{
TElemType data;//结点数据域
struct BiTNode *lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;

遍历二叉树

遍历二叉树是沿着某个指定路径有规律的进行访问树的每一个结点,保证每个结点均能被访问一次,并且只能被访问一次。

遍历的实质是通过遍历结果将非线性结构的树中结点排成一个线性序列。

通过上一篇树、二叉树(一)
我们得知二叉树有根结点(D)、左子树(L)和右子树(R)三部分组成。
根据高中数学知识得知一共有DLR、LDR、LRD、DRL、RDL、RLD六种方式遍历。但若限定先左后右的原则则只有DLR、LDR、LRD三种情况,分别称为先(根)序遍历、中(根)序遍历、后(根)序遍历。

先序遍历

(1)访问根节点;

(2)先序遍历左子树;

(3)先序遍历右子数。

Status PreOrderTraverse(BiTree T)
{
 if(T==NULL)return OK;//空二叉树
 else{
 cout<<T->data;//访问根结点
 Pre
时间: 2024-11-03 01:00:24

树、二叉树(二)的相关文章

纸上谈兵: 树, 二叉树, 二叉搜索树[转]

树的特征和定义 树(Tree)是元素的集合.我们先以比较直观的方式介绍树.下面的数据结构是一个树: 树有多个节点(node),用以储存元素.某些节点之间存在一定的关系,用连线表示,连线称为边(edge).边的上端节点称为父节点,下端称为子节点.树像是一个不断分叉的树根. 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent).比如说,3,5是6的子节点,6是3,5的父节点:1,8,7是3的子节点, 3是1,8,7的父节点.树有一个没有父节点的节点,称为根节点(

纸上谈兵: 树, 二叉树, 二叉搜索树

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   树的特征和定义 树(Tree)是元素的集合.我们先以比较直观的方式介绍树.下面的数据结构是一个树: 树有多个节点(node),用以储存元素.某些节点之间存在一定的关系,用连线表示,连线称为边(edge).边的上端节点称为父节点,下端称为子节点.树像是一个不断分叉的树根. 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent).比如说,3,5

树, 二叉树及二叉搜索树的简介与实现

树的特征和定义 树(Tree)是元素的集合.我们先以比较直观的方式介绍树.下面的数据结构是一个树: 树有多个节点(node),用以储存元素.每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent).比如说,3,5是6的子节点,6是3,5的父节点:1,8,7是3的子节点, 3是1,8,7的父节点.树有一个没有父节点的节点,称为根节点(root),如图中的6.没有子节点的节点称为叶节点(leaf),比如图中的1,8,9,5节点.从图中还可以看到,上面的树总共有4个层

AVL树简介及实现

二叉搜索树的深度与搜索效率 我们在树, 二叉树, 二叉搜索树中提到,一个有n个节点的二叉树,它的最小深度为log(n),最大深度为n.比如下面两个二叉树: 深度为n的二叉树

纸上谈兵: AVL树[转]

二叉搜索树的深度与搜索效率 我们在树, 二叉树, 二叉搜索树中提到,一个有n个节点的二叉树,它的最小深度为log(n),最大深度为n.比如下面两个二叉树: 深度为n的二叉树 深度为log(n)的二叉树 这两个二叉树同时也是二叉搜索树(参考树, 二叉树, 二叉搜索树).注意,log以2为基底.log(n)是指深度的量级.根据我们对深度的定义,精确的最小深度为floor(log(n)+1). 我们将处于同一深度的节点归为一层.如果除最后一层外的其他层都被节点填满时,二叉树有最小深度log(n). 二

纸上谈兵: AVL树

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   二叉搜索树的深度与搜索效率 我们在树, 二叉树, 二叉搜索树中提到,一个有n个节点的二叉树,它的最小深度为log(n),最大深度为n.比如下面两个二叉树: 深度为n的二叉树 深度为log(n)的二叉树 这两个二叉树同时也是二叉搜索树(参考树, 二叉树, 二叉搜索树).注意,log以2为基底.log(n)是指深度的量级.根据我们对深度的定义,精确的最小深度为floor(log(

纸上谈兵: 算法与数据结构

算法和数据结构是计算机科学的核心内容.作为程序员,编程是我们的实战项目.然而,写出程序还不够.一个程序在应对一些大型而复杂的情况时,会耗费大量的时间.我们可以很容易写出一个从文件中找到一个词的程序,比如逐词扫描,看是否相符.但如果我们的文件有几十TB,而且要从文件中找到上百个词,逐个扫描的办法就几乎不可行.我们需要优化程序,以便我们的程序可以应对复杂问题.算法研究解决问题的方法,而数据结构则是设计一种更好的组织数据和使用数据的方式.两者有很强的相互依赖关系,所以往往放在一起讨论.   我将这一系

[算法系列之二十三]线段树(Interval Tree)

一 背景 在信息学竞赛中,我们经常会碰到一些跟区间有关的问题,比如给一些区 间线段求并区间的长度,或者并区间的个数等等.这些问题的描述都非常简单,但是通常情况下数据范围会非常大,而朴素方法的时间复杂度过高,导致不能在规定时间内得到问题的解.这时,我们需要一种高效的数据结构来处理这样的问题,在本文中,我们介绍一种基于分治思想的数据结构--线段树. 二 简介 线段树是一种二叉树形结构,属于平衡树的一种.它将线段区间组织成树形的结构,并用每个节点来表示一条线段.一棵[1,10)的线段树的结构如图1.1

树与森林的存储、遍历和树与森林的转换

树的存储结构     双亲表示法   孩子表示法: (a)多重链表(链表中每个指针指向一棵子树的根结点); (b)把每个跟结点的孩子结点排列起来,看成一个线性表,且以单链表做存储结构.且N个头指针也组成一个线性表.   孩子兄弟表示法://二叉树表示法或二叉链表表示法 以二叉链表做树的存储结构,链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点(fchild 和nsibling) //孩子兄弟表示法 typedef struct CSNode{ int data; CSNode