IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 树、森林与二叉树的转换 -> 正文阅读

[数据结构与算法]树、森林与二叉树的转换


——逻辑结构,其存储结构有顺序、链式存储。
树的三种表示法:
1.双亲表示法——顺序存储,每个结点包括:结点值 data、双亲的下标 parent。一般用数组实现。
2.孩子表示法——链式存储,将每个结点的孩子用单链表连接起来。
3. 孩子兄弟表示法——链式存储(二叉树表示法),每个结点包括:结点值 data、指向第一个孩子的指针 firstchild,指向结点下一个兄弟的指针 nextsibling

一.转换

  • 树、森林、二叉树 之间的转化是 唯一的

1.树 ? \longleftrightarrow ?二叉树

(1)树 → \rightarrow 二叉树

  1. 将所有兄弟相连
  2. 保留指向第一个孩子的指针,抹去其他
  3. 以根为轴心顺时针转45°(即将所有兄弟变成右子)
    实际上是一个,从上到下,从左到右的右兄变右子的过程。
    借鉴图
    树的先跟、二叉树的先序均为:ABEFGCHDIJ
    树的后跟、二叉树的中序均为:EFGBHCIJDA

(2)二叉树 → \rightarrow
从上到下,依次将所有结点的右子变成其的右兄弟即可。


2.森林 ? \longleftrightarrow ?二叉树

森林即一些树的集合。

(1)森林 → \rightarrow 二叉树

  1. 将每棵树转化成二叉树
  2. 将每棵树的根视为兄弟结点,依次连接
  3. 以第一颗树的根为轴心旋转45°(即将右兄(根)变右子)
    在这里插入图片描述
    森林、二叉树的先序均为:ABCDEFGHJI
    森林、二叉树的中序均为:BCDAFEJHIG

(2)二叉树 → \rightarrow 森林
1.从上到下,每次将根的右链断开,得到一些二叉树
2.将所有二叉树转化成树,得到森林
在这里插入图片描述

题——空指针计算:

树/森林 的叶结点数: n 1 n_1 n1?,非终端结点数: n 2 n_2 n2?,则转换成二叉树后
左子为空结点数: n 1 n_1 n1?,右子为空结点数: n 2 + 1 n_2+1 n2?+1

左子为空 = 叶结点数
树/森林:只有叶结点没有孩子,转化成二叉树后,左子为空,所以是 n 1 n_1 n1?

右子为空 = 非叶结点数 + 1(根)
树/森林:每个非叶结点都有孩子,其最右边的孩子必然无右兄,即转换成二叉树后必然右子为空, n 2 n_2 n2?个右子为空
树:树的根无右兄,故 n 2 + 1 n_2+1 n2?+1
森林:森林的根视为兄弟相连,其最右边的根无右兄,故也是 n 2 + 1 n_2+1 n2?+1

2011统考真题:2011个结点的树,叶结点数为116,其对应的二叉树中无右孩子节点的个数是:2011-116+1 = 1896
2014统考真题:森林F转换成二叉树T后,F中叶结点个数等于:T中左孩子指针为空的结点个数

树的 结点数=边数+1(结点数=总度数+1)
所以 森林中的 总结点数-总边数=森林中树的个数

2016统考真题:若森林F有15条边,25个结点,则F包含树的个数:25-15=10


二.遍历

1.树:

先根遍历:先访问根,再访问子树。对树的每一棵子树递归进行。
后跟遍历:先访问子树,后访问根。递归进行。

2.森林:

先序遍历:先访问第一棵树的根节点,先序遍历第一棵树根节点的子树森林,先序遍历第一棵树外其他树组成的森林。
中序遍历:中序遍历第一棵树的根节点的子树森林,访问第一棵树的根节点,中序遍历第一棵树外其他树组成的森林。

先根:根子
后根:子根
先序遍历森林:对每棵树依次进行先跟遍历
中序遍历森林:对每棵树依次进行后根遍历

森林二叉树
先跟先序先序
后跟中序中序

等价关系:
先根 = 森林先序 = 二叉树先序
后根 = 森林中序 = 二叉树中序

2019统考真题 将树T转换成二叉树BT,则与T的后跟遍历相同的是:BT的中序遍历

三.树练习

1.求树叶子结点个数

孩子兄弟链表为存储结构。

int Q5(Tree T) {
	if (T == NULL)
		return 0;
	if(T->child==NULL)      //没有孩子的时候,说明是叶结点
		return Q5(T->sibling) + 1;
	else
		return Q5(T->sibling) + Q5(T->child);
}

2.求树高

孩子兄弟链表为存储结构。

int Q6(Tree T) {
	if (T == NULL)
		return 0;
	else
		return Q6(T->child) + 1 > Q6(T->sibling) ? Q6(T->child) + 1 : Q6(T->sibling);
}

一般二叉树的递归求高为

return Q(T->lchild) > Q(T->rchild) ? Q(T->lchild) + 1 : Q(T->rchild) + 1;
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:43:11  更:2021-08-21 15:44:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:41:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码