数据结构——树笔记1

树属于非线性数据结构,它是一种层次结构:如果存在前驱节点,则是唯一
的,如果存在后继节点,则可以是多个。即树的元素之间是一对多的关系。
树是由n个节点构成的有限集合T,如果n = 0,则是空树,如果n不等于0,则
一个非空树,有且只有一个根结点root,如果n>1,则除了根结点外,其余节
点又可以划分为有限集T1,T2......Tm 其中每个有限集有是一棵树。称为子
树subtree.
树的存储结构
    双亲表示法
 孩子表示法
 孩子兄弟表示法(二叉树表示法)

森林:M棵互不相交的树的集合。

二叉树:
    二叉树的特点是每个节点至多只有两颗子树,并且二叉树的子树有左右之
 分,它的次序不能任意颠倒。
   
    二叉树的特点:
     在二叉树的第i层上至多有2的i-1次方个节点
  深度为k的二叉树至多有2的k次方-1个节点
  如果一颗二叉树的终端节点的数目为i,深度为2的节点数目为j,则i=j+1
  
 满二叉树:深度为k且节点数目为2的k次方-1的二叉树
 完全二叉树:只有在最下面一层的右边缺少若干个节点的满二叉树
 
 二叉树的存储结构:
     按顺序储存,即使用一组连续的储存单元,自上而下,自左而右的储存,每
  个空节点也会占用一个储存单元。这样的储存方式只适合完全二叉树,因为
  会浪费大量空间。
  
  链式储存结构:二叉树的节点至少包括三个域,数据域和指向左右子树的指
  针域,有时候也增加一个指向双亲的指针域来方便指向节点的双亲。
  
 二叉树的遍历:以一定的规则将非线性的节点排列成线性序列
     先序遍历二叉树:
      先访问根结点,再先序遍历左子树,最后先序遍历右子树
  中序遍历二叉树
      先中序遍历左子树,在访问根结点,最后中序遍历右子树
  后序遍历二叉树
      先后序遍历左子树,在后序遍历右子树,最后访问根结点
  
  在已知两种遍历的情况下可以得出原二叉树的形状,这两种遍历可以是先序
  和后序,也可以是中序和后序

// 二叉树的初始化
void Init_BitTree(BiTree * T)
{
    *T = NULL;

    return;
}

// 销毁二叉树
void Destroy_BitTree(BiTree * T)
{
    if ((*T)->lchild)
        Destroy_BitTree(&((*T)->lchild));
    if ((*T)->rchild)
        Destroy_BitTree(&((*T)->rchild));
    free(*T);
    *T = NULL;

    return;
}

// 二叉树的插入,通过判断LR的值,判断插入选择
int Insert_Child(BiTree p, int LR, BiTree c)
{
    if (p)   // p指向的二叉树非空
    {
        if (0 == LR)
        {
            c->rchild = p->lchild;  // p原来的左子树称为c的右子树
            p->lchild = c;          // 子树c作为p的左子树
        }
        else
        {
            c->rchild = p->rchild;
            p->rchild = c;
            return 1;
        }
    } 

    return 0;
}

// 返回二叉树e的左孩子节点的元素值
int Left_Child(BiTree T, int e)
{
    BiTree p;
    if (T)           // 当二叉树T不为空时
    {
        p = Point(T, e);   // p是元素值e的节点的指针
        if (p && p->lchild)  // 如果p的节点不为空,且p的左孩子节点存在
            return p->lchild->data;   // 返回左孩子节点的元素值
    } 

    return 0;
}

// 返回二叉树e的右孩子节点的元素值
int Right_Child(BiTree T, int e)
{
    BiTree p;
    if (T)           // 当二叉树T不为空时
    {
        p = Point(T, e);   // p是元素值e的节点的指针
        if (p && p->rchild)  // 如果p的节点不为空,且p的左右孩子节点存在
            return p->rchild->data;   // 返回右孩子节点的元素值
    } 

    return 0;
}

// 在二叉树中寻找元素值为e的节点,此处假定该二叉树的节点元素值各不相同,如果找到返回该节点的地址,否则返回NULL
BiTree Point(BiTree T, int e)
{
    if (e == T->data)
    {
        return T;
    }
    else
    {
        if (T->lchild != NULL)
            Point(T->lchild, e);
        if (T->rchild != NULL)
            Point(T->rchild, e);
    }

    return NULL;
}

// 删除子树操作,根据LR的值选择删除的是左子树还是右子树
int Delete_Child(BiTree p, int LR)
{
    if (p)          // 判断p不空
    {
        if (0 == LR)
            Destroy_BitTree(&(p->lchild));
        else
            Destroy_BitTree(&(p->rchild));
        return 1;
     } 

     return 0;
}
时间: 2024-10-27 07:23:39

数据结构——树笔记1的相关文章

大话数据结构读书笔记系列(六)树<上篇>

转载请注明出处:http://blog.csdn.net/u010194538/article/details/51212759 这章内容比较多,分为上和下2篇: 第6章树 6.2 树的定义 之前我们一直在谈的是一对一的线性结构,可现实中,还有很多一对多的情况需要处理,所以我们需要研究这种一对多的数据结构--"树". 树(Tree)是n(n≥0)个结点的有限集.n=0时称为空树.在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点:(2)当n>1时,其余结点可分为

小猪的数据结构学习笔记(四)

小猪的数据结构学习笔记(四) 线性表之静态链表 --转载请注明出处:coder-pig 本章引言: 在二,三中中我们分别学习了顺序表中的线性表与单链表,线性表有点类似于 我们前面所学的数组,而单链表使用的最多的是指针,这里问个简单的问题, 如果是在以前没有指针的话,前辈先人们怎么实现单链表呢?大家思考下! 没有指针,那么用什么来代替呢?前辈先人们非常机智,想出了使用下标+游标的方式 来实现单链表的效果!也就是今天要讲的--静态链表! 当然你也可以直接跳过本章,因为有了单链表就没有必要用静态链表了

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

数据结构--树(定义与存储结构)

树基本定义 树的定义 数是具有n个节点的有限集.如图即是一个树形结构. 节点分类 节点的度:一个节点拥有的子节点即成为节点的度,比如A节点,有B和C两个子节点,那么A节点的度=2. 叶节点(终端节点):没有子节点的节点,比如G.H.I.... 如图: 节点间关系 孩子节点:某一个节点的子节点称为孩子节点.比如B.C节点是A节点的孩子节点. 双亲节点:与孩子节点相反.比如,A节点是B.C的双亲节点. 兄弟节点:同一个双亲节点的孩子节点,之间称为兄弟节点.比如,B.C为兄弟节点. 如图: 树的存储结

数据结构--树的一些计算

先解释一下一些最基本的概念 结点的孩子结点个数即为该结点的度.度为0的结点叫叶子结点.处在树的最顶端(没有双亲)的结点叫根结点. 介绍一下公式 k:总度数k+1:总节点数 为什么总节点数肯定比总度数多1呢?其实很简单可以解释,度可以看作节点与节点之间的线,多1就是显而易见的 设该二叉树总结点数为N,叶子结点个数为n0,度为1的结点个数为n1.度为2的节点个数为n2下面可得两等式:(1) N = n2 + n0 + n1;依据:很显然,二叉树总结点数等于度分别为0,1,2的结点个数总和.(2) N

小猪的数据结构学习笔记(五)

小猪的数据结构学习笔记(五) 线性表之--循环链表                           --转载请注明出处:coder-pig 循环链表知识点归纳: 相关代码实现: ①判断是否为空表: ②单循环链表的存储结构 其实和单链表的结构是一样的! /*定义循环链表的存储结构*/ typedef struct Cir_List { int data; struct Cir_List *next; }Lnode; ③初始化循环单链表 代码如下: //1.循环链表的初始化 //表示一个元素,如

数据结构学习笔记之栈

栈(stack)  是限定仅在表尾进行插入或删除操作的线性表.因此,对栈来说,表尾端有其特殊含义,称为栈项(top),相应地,表头端称为栈底(bottom).不含元素的空表称为空栈. 栈有两种存储表示方法:顺序栈和链栈.顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置.通常的习惯做法是以top=0表示空栈,鉴于C语言中数组的下标约定从0开始,则当以C作描述语言时,如此设定会带来很大不便:另一方面,由于栈在使用过程

数据结构学习笔记(1)-数据结构与算法

基本概念和术语 1.数据  数据元素  数据对象   数据结构 数据:在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称. 数据元素:是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理. 数据对象:是性质相同的数据元素的集合.是数据的一个子集. 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合. 2.数据结构 数据结构分为逻辑结构和物理结构 2.1逻辑结构 逻辑结构表示数据之间的相互关系.通常有四种基本结构: 集合:结构中的数据元素除了同属于一种类型外,别

【数据结构学习笔记(C#描述)】(二)算法分析

由上一章的内容可知软件质量的重要特征之一就是能够高效的利用资源(运行效率),因此我们就要考虑如何创建出能够高效利用CPU及内存的数据结构与算法.而算法分析的目的就是为了让我们能够认识到算法对于资源的利用效率. 我们要想分析算法的效率,就需要找到一个评价算法效率的标准及方法. 一般我们如果能快速的利用CPU就会更好的节省时间,因此在时间层面上我们的评价标准就是时间复杂度,而如果我们能够较好的利用内存的话我们将会节省更多的内存空间,因此在空间层面上我们的评价标准就是空间复杂度. 所谓时间复杂度和空间