数据结构之树

一、树

1.概念

前驱唯一,后驱不唯一(一对多,是非线性结构,结点之间有分支,具有层次关系)

数是n(n>=0)个结点的有限集

若n=0为空树

n>0时,有且仅有一个特定的称为根的结点
其余结点可以分为m(m>=0)个互不相交的有限集T1,T2,T3...Tm,其中每一个集合本身又是一棵树,并称为根的子树

2.树的基本术语

结点:数据元素以及指向子树的分支
根结点:非空树中无前驱结点的结点

结点的度:结点拥有的子树数(后继结点的个数)
树的度:树内各结点的度的最大值( 度为零的结点成为叶子,也称终端结点, 度不为零的结点为非终端结点)

树的深度:树中结点的最大层次

有序树:树中结点的各子树从左至右有次序

森林:m(m>=0)棵互不相交的树的集合

3.树的遍历

树的遍历一般分为两种深度优先遍历 和 广度优先遍历 。

深度优先遍历又根据处理节点的顺序不同,可以分为:中序遍历、前序遍历和后序遍历。这些知识点也是深度优先遍历经常考察的。

广度优先遍历的考察在于层次遍历,比如需要我们按照层次输出一棵树的所有节点的组合,比如求一棵树的最左节点

二、二叉树

1.二叉树的概念

二叉树的结构最简单,规律性最强且所有树都能转为唯一对应的二叉树,不失一般性,普通树不转化为二叉树运算很难实现

二叉树:是n(n>=0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的分别称为这个根的左子树和右子树的二叉树组成。

特点:1.每个结点最多有两个子树(二叉树中不存在度大于2的结点)
          2.子树有左右之分,其次序不能颠倒
          3.二叉树可以是空集合,根可以有空的左

二叉树不是树的特殊情况,是两个概念(二叉树会严格区分左右子树,可以是空,但是不可以说没有它的位置)
虽然二叉树和树的概念不同,但是有关树的基本术语对二叉树都适用。

2.二叉树的性质

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

3.二叉树的数据结构

1.二叉树的顺序存储

实现:安装满二叉树的结点层次编号,依次存放二叉树中的数据元素。

#define MAXTIZE 100
Typedef TElemType SqBiTree [MAXSTIZE]
SqBiTree bt

缺点:可能会浪费很多空间,仅有右分支或者左分支的情况下,会浪费。只适用于满二叉树和完全二叉树

2.二叉树的链式存储结构

实现:三叉链表
一个二叉树结点的前驱后继分别指向了两个子结点,增加一个指向:上一个二叉树结点的指针域

typedef struct BiNode() {
    TElemType data
    struct BiNode *lchild,*rchild,*parent
}BiNode, *BiTree

三、线索二叉树

利用二叉链表中的空指针域:

如果某个结点的左孩子为空,则将空的左孩子指针域改为指向其前驱,如果某结点的右孩子为空,则将空的右孩子指针域改为指向其后继。——这种改变指向的指针称为“线索”。加上了线索的二叉树被称为线索二叉树

对二叉树按某种遍历次序使其变为线索二叉树的过程叫线索化

为了区分左右指针域到底是指向孩子的指针还是指向前驱或者后继的指针,对二叉链表中每个结点增设两个标志域ltag和rtag并且约定:0是指向孩子,1是指向前驱后继

posted @   铜须的编程生活  阅读(79)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示