树、二叉树和森林的表示及相互转换

简介: 树、二叉树和森林的表示及相互转换

相关概念

树的基本概念

在这里插入图片描述

  • 树的定义:树是n(n >= 0)个节点的==有限==集。当n=0是,称为空树。
  • 树的特点:

(1)树的根没有前驱,除根外的其他节点有且仅有一个前驱;
(2)每个节点都可以有零个或多个后继。

  • 术语:

(1)节点的度:树中一个节点的孩子个数。
(2)树的度:树中节点的最大度。
(3)分支节点:度大于0的节点。
(4)叶子结点:度为0的节点。
(5)节点的深度:从根节点开始自顶向下逐层累加。
(6)节点的高度:从叶子节点开始自底向上逐层累加。
(7)树的高度:树中节点的最大层数。
(8)路径:两个节点之间所经过的节点序列。
(9)路径长度:路径上所经过的边的个数。
(10)森林:m(m >= 0)棵互不相交的树的集合。

二叉树的基本概念

在这里插入图片描述

  • 二叉树的定义:一种特殊的树形结构,它的特点是每个节点至多有两颗子树(即二叉树中不存在度大于2的节点),并且二叉树的子树有左右之分,不能随意颠倒。
  • 几种特殊的二叉树:

(1)满二叉树:一棵高度为h,且含有2^h - 1个节点的二叉树。
在这里插入图片描述
(2)完全二叉树:对应相同高度的满二叉树缺失最下层最右边的一些连续叶子结点。
(3)二叉排序树:左子树上所有节点的关键字都小于根节点的关键字;右子树上所有节点的关键字都大于根节点的关键字;左子树和右子树又各是一棵二叉排序树。(左 < 根 < 右)
(4)平衡二叉树:任一节点的左子树和右子树的深度之差不超过1的二叉排序树。

  • 二叉树的性质:

(1)二叉树的第i层上至多有2^i-1^个节点;
(2)深度为h的二叉树至多有2^k^ - 1个节点;
(3)对任何一个二叉树,若其终端节点树为n0,度为2的节点树为n2,则n0 = n2 + 1;
(4)具有n个节点的完全二叉树的深度为log~2~(n + 1)向上取整。
(5)对完全二叉树按从上到下、从左到右的顺序依次编号1,2,3,...,则有以下关系:
a. 当i>1时,节点i的双亲的编号为i / 2;
b. 当2i<=n时,节点i的左孩子编号为2i,否则无左孩子;
c. 当2i+1<=n时,节点i的右孩子编号为2i+1,否则无右孩子;
d.节点i所在层次为log~2~i + 1(向下取整)。

存储结构

二叉树的存储结构

  • 顺序存储结构:用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素,即将完全二叉树上编号为i的结点元素存储在某个数组下标为i-1的分量中。(适合完全二叉树和满二叉树)

在这里插入图片描述

  • 链式存储结构:使用链表节点来存储二叉树中的每个节点。二叉链表包括数据域data、左指针域lchild和右指针域rchild三个域。

在这里插入图片描述

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

树的存储结构

  • 双亲表示法:用一组连续空间来存储树的每个结点,同时在每个结点中,附设一个指示器指示其双亲结点到链表中的位置。

在这里插入图片描述

#define MAX_TREE_SIZE 100    //节点最大个数
typedef struct PTNode{        //节点结构
    TElemType data;
    int parent;                //双亲位置域
}PTNode;
typedef struct{                //树结构
    PTNode nodes[MAX_TREE_SIZE ];
    int root,n;        //根的位置和节点数
}PTree;
  • 孩子表示法:将没得节点的孩子节点都用单链表链接起来形成一个线性结构,此时n个节点就有n个孩子链表。

在这里插入图片描述

#define MAX_TREE_SIZE 100    //节点最大个数
typedef struct CTNode{        //孩子节点
    int child;
    struct CTNode *next;
}*ChildPtr;
typedef struct{                
    TElemType data;
    ChildPtr firstChild;    //孩子链表头指针
}CTBox;
typedef struct{                //树结构
    CTBox nodes[MAX_TREE_SIZE ];
    int root,n;        //根的位置和节点数
}CTree;
  • 孩子兄弟表示法(二叉树表示法):以二叉链表作为树的存储结构。每个节点包括三部分内容:节点值、指向第一个孩子结点的指针和指向下一个兄弟节点的指针。

在这里插入图片描述

typedef struct CSNode{        //节点结构
    TElemType data;
    struct CSNode *firstChild,*nextSibling;
}CSNode,*CSTree;

树、二叉树和森林的相互转换

树转换为二叉树

  • 规则:每个节点左指针指向它的第一个孩子,右指针指向它在树中的相邻右兄弟。由于根节点没有兄弟,所以对应的二叉树没有右子树。
  • 画法:(1)在兄弟节点之间加一条线;(2)在每棵树根之间加一条线;(3)以第一棵根为轴心,顺时针旋转45度。

在这里插入图片描述

森林转换为二叉树

  • 规则:先将森林中的每棵树转换为二叉树,由于任何一棵和树对应的二叉树的右子树为空,若把森林中第二棵树根视为第一棵树根的右兄弟,即将第二棵树对应的二叉树当做第一棵二叉树根的右子树,将第三棵树对应的二叉树当做第二棵二叉树根的右子树......以此类推,即可将森林转换为二叉树。
  • 画法:(1)将森林中的每棵树转换为二叉树;(2)对每个节点,只保留它与第一个孩子的连线;(3)以根为轴心,顺时针旋转45度。

在这里插入图片描述

二叉树转换为森林

  • 若二叉树非空,则二叉树的根及其左子树为第一棵树的二叉树形式,将根与右子树断开
  • 将右子树视为一棵新的二叉树,重复第一步。

在这里插入图片描述

目录
相关文章
|
8月前
二叉树基础oj练习(对称二叉树、翻转二叉树、另一棵树的子树二叉树的构建及遍历)
二叉树基础oj练习(对称二叉树、翻转二叉树、另一棵树的子树二叉树的构建及遍历)
48 0
【LeetCode】1022. 从根到叶的二进制数之和、563. 二叉树的坡度
1022. 从根到叶的二进制数之和 1022. 从根到叶的二进制数之和
51 0
|
4月前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
7月前
|
机器学习/深度学习 存储
数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)
数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)
224 1
|
7月前
|
算法
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
72 0
|
8月前
|
存储
树的存储结构以及树,二叉树,森林之间的转换
树的存储结构以及树,二叉树,森林之间的转换
42 0
|
存储
大话数据结构--树、森林与二叉树的转换
大话数据结构--树、森林与二叉树的转换
142 0
|
机器学习/深度学习 存储 算法
408数据结构学习笔记——树与二叉树的应用——哈夫曼树和哈夫曼编码、并查集
408数据结构学习笔记——树与二叉树的应用——哈夫曼树和哈夫曼编码、并查集
263 1
408数据结构学习笔记——树与二叉树的应用——哈夫曼树和哈夫曼编码、并查集
数据结构学习笔记——树的存储结构以及树、森林与二叉树之间的转换
数据结构学习笔记——树的存储结构以及树、森林与二叉树之间的转换
数据结构学习笔记——树的存储结构以及树、森林与二叉树之间的转换
树和二叉树,完美/满二叉树和完全二叉树之间的区别对比
树和二叉树,完美/满二叉树和完全二叉树之间的区别对比