数据结构之树、森林和二叉树的转换

树转换为二叉树
(1)加线。在所有兄弟结点之间加一条连线。
(2)去线。树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线。
(3)层次调整。以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。(注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子)

森林转换为二叉树
(1)把每棵树转换为二叉树。
(2)第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来。

二叉树转换为树
是树转换为二叉树的逆过程。
(1)加线。若某结点X的左孩子结点存在,则将这个左孩子的右孩子结点、右孩子的右孩子结点、右孩子的右孩子的右孩子结点…,都作为结点X的孩子。将结点X与这些右孩子结点用线连接起来。
(2)去线。删除原二叉树中所有结点与其右孩子结点的连线。
(3)层次调整。

二叉树转换为森林
假如一棵二叉树的根节点有右孩子,则这棵二叉树能够转换为森林,否则将转换为一棵树。
(1)从根节点开始,若右孩子存在,则把与右孩子结点的连线删除。再查看分离后的二叉树,若其根节点的右孩子存在,则连线删除…。直到所有这些根节点与右孩子的连线都删除为止。
(2)将每棵分离后的二叉树转换为树。

时间: 2024-10-25 01:24:25

数据结构之树、森林和二叉树的转换的相关文章

数据结构C语言实现之二叉树

#include <stdio.h>#include <stdlib.h>#define STACK_MAX_SIZE 30#define QUEUE_MAX_SIZE 30#ifndef elemType typedef char elemType;#endif /************************************************************************//* 以下是关于二叉树操作的11个简单算法 *//***********

数据结构之树

树:非线性结构------其实更像是一串葡萄,哈哈 定义: 专业定义: 1.有且只有一个成为根节点: 2.有若干个互不相交的的子树,这些子树本身也是一颗树: 通俗的定义: 1.树是由节点和边(指针域)组成: 2.每个节点只有一个父节点,但可以有很多个子节点: 3.但有一个节点例外,该节点没有父节点,此节点成为根节点: 涉及的术语: 节点, 父节点, 子节点, 子孙, 堂兄弟: 深度:从根节点到最底层节点的层数称之为深度: 叶子节点:没有子节点的节点 非终端节点:实际就是非叶子节点 度:子节点的个

但是存在了一点问题-数据结构课程设计:十进制二叉树四则运算计算器设计与实现

问题描述 数据结构课程设计:十进制二叉树四则运算计算器设计与实现 #include #include using namespace std; #define Stack_Size 100 typedef char ElemType; typedef struct { char elem[Stack_Size]; int top; }SqStack; void InitStack(SqStack &S) { //初始化顺序栈 // S.elem = new ElemType[Stack_Size

一个数据结构B_树问题

问题描述 一个数据结构B_树问题 一棵5阶B_树,高度是5,(叶子层不算)至少有多少个结点?------ 解决方案 高度为h的m阶B树至少有 1 + 2 * (1 - (m / 2) ^ (h - 1)) / (1 - ( m / 2)) 个结点 代入h=5 m=5,得到52. 解决方案二: B+树数据结构数据结构B-树数据结构B树

Linux 内核里的数据结构——基数树

Linux 内核里的数据结构--基数树 正如你所知道的,Linux内核提供了许多不同的库和函数,它们实现了不同的数据结构和算法.在这部分,我们将研究其中一种数据结构--基数树Radix tree.在 Linux 内核中,有两个文件与基数树的实现和API相关: include/linux/radix-tree.h lib/radix-tree.c 让我们先说说什么是 基数树 吧.基数树是一种 压缩的字典树compressed trie ,而字典树是实现了关联数组接口并允许以键值对 方式存储值的一种

大话数据结构十六:哈夫曼树(最优二叉树)

1. 引子 当前素质教育的背景下,小学的学科成绩都改为了优秀.良好.及格.不及格这样的模糊词语,而不再通报具体的分数. 用代码可以表示如下: if( a < 60 ) System.out.print("不及格"); else if( a < 70 ) System.out.print("及格"); else if( a < 90 ) System.out.print("良好"); else System.out.print(&

数据结构的C++实现之二叉树的遍历和存储结构

在<二叉树的定义和性质>中我们已经认识了二叉树这种数据结构.我们知道链表的每个节点可以有一个后继,而二叉 树(Binary Tree)的每个节点可以有两个后继.比如这样定义二叉树的节点: typedef struct node *link; struct node { unsigned char item; link l, r; }; 这样的节点可以组织成 下图所示的形态. 二叉树可以这样递归地定义: 1. 就像链表有头指针一样,每个二叉树都有一个根指针(上图中的root指针)指向它 .根指针

数据结构与算法04 之二叉树

   在有序数组中,可以快速找到特定的值,但是想在有序数组中插入一个新的数据项,就必须首先找出新数据项插入的位置,然后将比新数据项大的数据项向后移动一位,来给新的数据项腾出空间,删除同理,这样移动很费时.显而易见,如果要做很多的插入和删除操作和删除操作,就不该选用有序数组.         另一方面,链表中可以快速添加和删除某个数据项,但是在链表中查找数据项可不容易,必须从头开始访问链表的每一个数据项,直到找到该数据项为止,这个过程很慢.         树这种数据结构,既能像链表那样快速的插入

数据结构教程 第二十三课 二叉树的存储结构

教学目的: 掌握二叉树的两种存储结构 教学重点: 链式存储结构 教学难点: 链式存储二叉树的基本操作 授课内容: 一.复习二叉树的定义 二叉树的基本特征:每个结点的度不大于2. 二.顺序存储结构 #define MAX_TREE_SIZE 100 typedef TElemType SqBiTree[MAX_TREE_SIZE]; SqBiTree bt; 结点编号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 结点值 1 2 3 4 5 0 0 0 0 6 7 0 0