数据结构(二)非线性结构之二叉树

没有天生的信心,只有不断培养的信心。

/**
*@author StormMaybin
@Date 2016-07-17
*/

上上一篇文章总结了一下线性表,今天就来总结一下数据结构中非线性部分,非线性数据结构包括树图以及网!今天我们先来看看二叉树!二叉树是一种特殊的树结构。在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。


基本概念:

二叉树是很重要的数据结构,要想搞清楚二叉树,先要对基本概念了解透彻。

  1. 完全二叉树:若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
  2. 满二叉树:除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。
  3. 平衡二叉树:平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
  4. 树的结点:包含一个数据元素及若干指向子树的分支;
  5. 孩子结点:结点的子树的根称为该结点的孩子;
  6. 双亲结点:B 结点是A 结点的孩子,则A结点是B 结点的双亲;
  7. 兄弟结点:同一双亲的孩子结点; 堂兄结点:同一层上结点;
  8. 祖先结点: 从根到该结点的所经分支上的所有结点子孙结点:以某结点为根的子树中任一结点都称为该结点的子孙;
    1. 结点层:根结点的层定义为1;根的孩子为第二层结点,依此类推;
    2. 树的深度:树中最大的结点层;
    3. 结点的度:结点子树的个数;
    4. 树的度: 树中最大的结点度;
    5. 叶子结点:也叫终端结点,是度为 0 的结点;
    6. 分枝结点:度不为0的结点;
    7. 有序树:子树有序的树,如:家族树;
    8. 无序树:不考虑子树的顺序 ;

重要性质:

说完了基本概念,现在就来看看二叉树都有什么性质。

  • 在非空二叉树中,第i层的结点总数不超过, i>=1;

这个没什么可解释的,第二层是2个,第三层是4个,第四层是8个······以此类推。

  • 深度为h的二叉树最多有个结点(h>=1),最少有h个结点;

由性质1可知,因为第i层的结点数为,依次累加可得到这个性质!

  • 对于任意一棵二叉树,如果其叶结点数为n0,而度数为2的结点总数为n2,则n0 = n2+1;

假设一个二叉树总结点个数为n,度为i的结点个数为ni,又因为二叉树的度小于等于2,那么得出关系式:n = n0 + n1 + n2;分支数B = n +1;B = 2n2 + n1;联合三个式子得出n = n0 + n1 + n2;

  • 具有n个结点的完全二叉树的深度为向下取整

设二叉树的结点数为n,因为由性质3可知,深度为h的结点数最多是,那么可以得到不等式:2^(h-1)-1 < n <= 2^(h)-1 —->2^(h-1) <= n+1 < 2^h;两边取对数可得:h-1 <= log2(n+1) < h;所以得证!

  • 有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:

    • 若I为结点编号则 如果I>1,则其父结点的编号为I/2;
    • 如果2*I<=N,则其左儿子(即左子树的根结点)的编号为2*I;若2*I>N,则无左儿子;
    • 如果2*I+1<=N,则其右儿子的结点编号为2*I+1;若2*I+1>N,则无右儿子。

对于这三个性质,很简单,因为结点数i的左孩子是2i,那么右孩子就是2i+1;显然上述性质得证!



接下来,我们就用代码来实现二叉树!

先开始定义数据类型

typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;  

创建二叉树

//先序建一颗二叉树
/**
*对于先序中序和后序,其实就是以root结点为先后顺序划分的
*如果,先开始输入的是root,那么就是先序,如果先开始输入左子树,然后是root,那么就是中序,后序就是root结点在最后输入!遍历也是如此!
*/
void Create(BiTree &T)
{
    char ch;
    scanf("%c",&ch);
    if(ch==‘#‘)
    T=NULL;
    else
    {
        T=(BiTNode *)malloc(sizeof(BiTNode));
        T->data=ch;
        //递归形式创建二叉树
        Create(T->lchild);
        Create(T->rchild);
    }
}  

先序遍历二叉树

void Preorder(BiTree &root)
{
    if(root!=NULL)
    {
        printf("%c ",root->data);
        Preorder(root->lchild);
        Preorder(root->rchild);
    }
}  

中序遍历打印二叉树

void Inorder(BiTree &root)
{
    if(root!=NULL)
    {
        Inorder(root->lchild);
        printf("%c ",root->data);
        Inorder(root->rchild);
    }
}  

后序打印二叉树

void Postorder(BiTree &root)
{
    if(root!=NULL)
    {
        Postorder(root->lchild);
        Postorder(root->rchild);
        printf("%c ",root->data);
    }
}  

这里的遍历过程有三种形式可选,先序中序和后序,区别无非就是递归调用时候的顺序不同,递归形式的遍历逻辑上很清晰!

先序遍历输出叶子节点

void Preorderleaf(BiTree &root)
{
    if(root!=NULL)
    {
        if(root->lchild==NULL&&root->rchild==NULL)
        printf("%c ",root->data);
        Preorderleaf(root->lchild);
        Preorderleaf(root->rchild);
    }
}  

统计叶子结点的个数

int LeafCount(BiTree &root)
{
    int leaf;
    if(root==NULL)
        leaf=0;
    else if(root->lchild==NULL&&root->rchild==NULL)
        leaf=1;
    else
        leaf=LeafCount(root->lchild)+LeafCount(root->rchild);
    return leaf;
}  

统计二叉树的深度

int Max (int x, int y)
{
    return x > y ? x : y;
}
int PostTreeDepth(BiTree &root)
{
    int hl,hr,max;
    if(root!=NULL)
    {
        hl=PostTreeDepth(root->lchild);
        hr=PostTreeDepth(root->rchild);
        max=Max(hl,hr);
        return max+1;
    }
    else
    return 0;
}  
void BinTreeSt()
{
    BiTree bt;
    Create(bt);
    Preorder(bt);
    printf("\n");
    Inorder(bt);
    printf("\n");
    Postorder(bt);
    printf("\n");
    printf("叶子节点:");
    Preorderleaf(bt);
    printf("\n");
    printf("叶子节点的个数为:%d\n",LeafCount(bt));
    printf("树的深度为:%d\n",PostTreeDepth(bt));
}  
int main()
{
    dowork();
    return 0;
}  

运行结果:

时间: 2024-08-06 04:54:18

数据结构(二)非线性结构之二叉树的相关文章

3、非线性结构--树与二叉树——数据结构【基础篇】

非线性结构--树与二叉树 二叉树的基础知识: 二叉树的特点: 1.每个结点的度<=2 2.二叉树是有序树 二叉树的五种不同的形态: 1.空树 2.一个根结点的根树 3.左子树 4.右子树 5.左右并存的二叉树 二叉树的性质: 性质1:二叉树第i层上的结点数目最多为 2{i-1} (i≥1) 性质2:深度为k的二叉树至多有2{k}-1个结点(k≥1) 性质3:包含n个结点的二叉树的高度至少为log2 (n+1) 性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2

数据结构和算法 (二)数据结构基础之树、二叉树

Java面试宝典之二叉树的实现 我们接着上一篇数据结构继续讲解.本章系数据结构之树与二叉树,从这章开始,我们就要介绍非线性结构了,这些内容理解起来比线性表稍难一些,我尽量写的通俗一些,如果读的过程中有任何问题,请按上述方式联系我! 一.树 树 形结构是一类重要的非线性结构.树形结构是结点之间有分支,并具有层次关系的结构.它非常类似于自然界中的树.树结构在客观世界中是大量存在的,例如家 谱.行政组织机构都可用树形象地表示.树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结

数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树

数据结构 参考:http://lupython.gitee.io/ 线性结构 就是能够用一根线串起来的数据结构 数组 (列表) 问:申请数组的前提条件是啥? a[12]?内存需要满足的条件? 答:内存必须有一块连续的内存空间 int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型. int a[7] = array(1,2,3,4,5,6,7) 问:如何申请内存? 答:C,C++语言,申请:mallco (28).释放:free(28) 问:int

【数据结构】二叉树链式结构--遍历二叉树

树是n(n>=0)个结点的有限集. 在任一颗非空数中: 1)有且仅有一个根节点 2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集,其中每一个集合也是一颗树,并且成为根的子树. 二叉树:n个结点的有限集合,该集合或者为空集(空),或者由一个根节点和两棵互不相交的.分别称为根结点的左子树和右子树的二叉树组成. 二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域,我们称这样的链表为二叉链表. 代码: #include "string.h" #inc

学好数据结构和算法 —— 非线性结构(上)

序言 上篇讲到线性结构,和线性结构相反的是非线性结构,非线性结构特点是一个结点元素可能有多个直接前驱和多个直接后继.常见的非线性结构有:二(多)维数组.树.图. 本来计划是非线性结构作为一篇,写着写着发现内容确实太多了,拆分为上.中.下3篇比较合适,所以改变了之前的计划. 1.二维数组 如:a[0][0]在水平方向有后继a[0][1],垂直方向有后继a[1][0],二维数组从水平方向或垂直方向看,某个元素都有前驱或后继,并不是线性结构. 二维数组的表示方法 矩阵表示法 行向量表示法 列向量表示法

4、非线性结构--图——数据结构【基础篇】

非线性结构--图 图的几个类别: 有向图 --有向图采用<>表示 无向图--无向图采用()表示 完全图无向图--如果具有n个顶点,n(n-1)/2条边的图 完全图有向图--如果具有n个顶点,n(n-1)条弧的图 稀疏图--如果边数小于完全图的边数 稠密图--如果边数大于完全图的边数 图的几个基本概念: 度--在图中,一个顶点依附的边数或弧的数目,某个顶点的出度和入度之和称为该顶点的度 入度--在图中,一个顶点依附的弧头数目 出度--在图中,一个顶点依附的弧尾数目 图的存贮结构: 1.图的邻接矩

数据结构实践项目——树和二叉树(1)

本文针对[数据结构基础系列(6):树和二叉树]第1-10课时 1 树结构导学 2 树的基本概念 3 树的基本术语 4 树的性质 5 树的存储结构 6 二叉树概念和性质 7 二叉树与树.森林之间的转换 8 二叉树的存储结构 9 二叉树的基本运算及其实现 10 二叉树的遍历 [项目1 - 二叉树算法库] 定义二叉树的链式存储结构,实现其基本运算,并完成测试. 要求: 1.头文件btree.h中定义数据结构并声明用于完成基本运算的函数.对应基本运算的函数包括: void CreateBTNode(BT

数据结构1 线性结构

数据结构是指数据元素的结合及元素间的相互关系和构造方法.元素之间的相互关系是数据的逻辑结构,元素关系的存储形式成为存储结构.数据结构按照逻辑关系的不同分为线性结构和非线性结构两大类.其中线性结构是最基本的结构,元素顺序排列,常见的有线性表.栈.队列.数组.串. 一.线性表 1.线性表是最简单也是最常用的一种线性结构.一个线性表示n(n>=0)个元素的有限序列,非空线性表的特点为: 存在唯一的一个"第一个"元素: 存在唯一的一个"最后一个"元素: 除第一个元素外

数据结构(十四)——二叉树

数据结构(十四)--二叉树 一.二叉树简介 1.二叉树简介 二叉树是由n(n>=0)个结点组成的有序集合,集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的.互不相交的二叉树组成.二叉树的五种形态: 2.二叉树的存储结构模型 树的另一种表示法:孩子兄弟表示法A.每个结点都有一个指向其第一个孩子的指针B.每个结点都有一个指向其第一个右兄弟的指针孩子兄弟表示法的特性:A.能够表示任意的树形结构B.每个结点包含一个数据成员和两个指针成员C.孩子结点指针和兄弟结点指针构成树杈 3.满二叉树