第四章
标签: 数据结构
定义:
树状一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一
棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个结点有零个或多个子结点;没有父结点
的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子
树。树是一对多的关系。
二叉树:

操作:
话不多说,我都写在代码里面。
#include<stdio.h>
#include<malloc.h>
#define crfun (node *)malloc(sizeof(node));
typedef struct node
{
char ch;
struct node *left;
struct node *right;
}node;
node *scanf_tree()//二叉树的建立
{
char ch=getchar();
if(ch!='\n')
{
node *p=crfun;
if(ch=='#')return NULL;
else
{
p->ch=ch;
p->left=scanf_tree();
p->right=scanf_tree();
return p;
}
}
}
void put_tree(node *head)//层序输出
{
node *a[10050];
int i=0,k=0;
if(head==NULL)return ;
else a[k++]=head;
while(i!=k)
{
head=a[i++];
if(head->left!=NULL)a[k++]=head->left;
if(head->right!=NULL)a[k++]=head->right;
}
for(i=0;i<k;i++)printf("%c",a[i]->ch);
}
void put_tree1(node *head)//先序
{
if(head==NULL)return ;
else
{
printf("%c",head->ch);
put_tree2(head->left);
put_tree2(head->right);
}
}
void put_tree2(node *head)//中序
{
if(head==NULL)return ;
else
{
put_tree2(head->left);
printf("%c",head->ch);
put_tree2(head->right);
}
}
void put_tree3(node *head)//后序
{
if(head==NULL)return ;
else
{
put_tree3(head->left);
put_tree3(head->right);
printf("%c",head->ch);
}
}
int main()
{
node *head;
head=crfun;
head=scanf_tree();
put_tree(head);
}
分类:
1.斜树:所有的节点都只有左子树的二叉树叫做左斜树,所有节点都只有右子树的二叉树叫做右斜树。这俩者统称
为斜树。
2.满二叉树:在一颗二叉树中,如果所有分治都存在左子树和右子树,并且所有叶子节点都在同一层上面,这样的
二叉树称为满二叉树。
3.完全二叉树:对一颗具有n个节点的二叉树按层序编号,如果编号为i (1<=i<=n) 的节点与同样深度的满二叉树中
编号为i的节点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。

树、森林、二叉树之间的转换
树转换为二叉树:
1.所有兄弟节点之间加一条线。
2.对树中每个节点,只保留他与第一个孩子的节点的连线,删除它与其他孩子节点之间的连线。
3.以树的根节点为轴心将整棵树顺时针旋转一定的角度,使之结构层次分明。
森林转换为二叉树:
森林是由若干个数组成的,所以完全可以理解为,森林中每一棵树都是兄弟。
1.把每个树转换成二叉树
2.第一课二叉树不动,从第二课二叉树开始,依次后一棵二叉树的根节点作为前一颗二叉树的根节点的右孩子,用
线连起来。当所有的二叉树链接起来后就完成了转换。
二叉树转换为树:
1.若某节点的左孩子存在,则将这个左孩子的所有右节点都作为此节点的孩子。将该节点与这些右孩子节点用线链
接起来。
2.删除原二叉树中所有节点与其右孩子节点的连线。
二叉树转换为森林:
判断一棵二叉树能够转为一棵树还是森林其实很简单,就是只要看这棵树根节点有没有右孩子,有就是森林,没有
就是一棵树。
1.从根节点开始,若右孩子存在,则把与右孩子节点的连线删除,再查看分离后的二叉树,若右孩子存在,则连线
删除,直到所有右孩子连线都删除为止,得到分离的二叉树。
2.再将每一颗二叉树转换成树就行了。
智能推荐
第四章 World Representations
4.4 世界表现(World Representations) 真实地游戏世界并不是由寻路算法所使用的节点和连线所组成。为了让游戏关卡能被寻路使用,需要把地图的几何图形和角色的移动能力转成由节点和连线组成的图结构。 对于每一种寻路世界表现,都是将游戏关卡分割成对应点和连接的链接区域。这些实现方式被称作划分方案(division schemes)。每一个划分方案都依次有三个考虑的重要特性:量化/本地...
【ADT】 第四章 树
树,大部分操作的运行时间平均为O(log N) 树是按照大小顺序存储的,不可重复的集合 Collection中基于二叉查找树实现了TreeSet和TreeMap类 二叉树是基于排序的,因此需要比较,二叉树中存储的对象需要实现Comparable接口 1 树 1.1 基础知识 1.2 树节点的声明 1.3 树的遍历 1.3.1 先序遍历 1.3.2 中序遍历 1.3.3 后序遍历 2 二叉树 2.1...
第四章——实践项目
并不太开心的是,没有自主做出实践题,只能先搜索来其他朋友所写的代码,再根据题干分析思路。 4.10.1 逗号代码 假定有下面这样的列表: 编写一个函数,它以一个列表值作为参数,返回一个字符串。该字符串包含所有表项,表项之间以逗号和空格分隔,并在最后一个表项之前插入and。例如,将前面的spam 列表传递给函数,将返回'apples, bananas, tofu, and cats'。但你的函数应该...
第四章串
1.串的定义和特点 1.串是由零到多个字符组成的字符序列。 2.串的模式匹配算法(查找子串): 找到主串中第一个等于子串首字符的位置,开始逐步遍历子串和主串 时间复杂度O(n*(m-n+1)),其中m,n是主串、子串长度 kmp算法:关键是部分匹配值的计算(”部分匹配”的实质是,有时候,字符串头部和尾部会有重复。 比如,”ABCDAB”之中有两个&r...
猜你喜欢
第四章 抽象:进程
第四章 抽象:进程 将程序的运行抽象为一个进程,使多个进程可以并发执行。 虚拟化CPU提供假象:有多个CPU 现在的CPU都是多核多线程的,也就是说,可以线程之间可以并行执行。 注:线程和进程的区别:起初是单CPU时代,程序的每次运行都会进行资源的分配,这时候,进程就是分配资源的最小单位;同时,单CPU时代,也没有引入线程的概念,所以,那时候,进程也是调度的最小单位。当进入多CPU多线程的时候,引...
第四章习题
下面我们来看一下函数这些题; ↓↓↓↓↓↓↓ 这道题就是把数字拆分了,然后求和; 我们来分析一下这道题: 1.提示用户输入一个数字 2.先计算该数字的反序 3.对比反序的数字和数字本身 4.输出 输入几个例子,看结果: 提示用户输入一个数字; 根据公式计算 输...
Python_第一天(安装、基本操作、数据类型)
哈哈哈哈,开通后,还是只是简单地记录了两篇SQL学习日记。果然是我任乐的风格。 最近重新捡起了一些统计分析方法,网盘资料不全,学习了一周,还得拿起大学记录的笔记,在那里看,算是捡起了一些,学多学少,算是让自己安心一丢丢,让无处安放的心找到地方。 python总是这学习一点那儿学习一点,久久捡起来用一下,没有系统地好好学习。今天就奋起,再从零捡起来一下。能坚持几天呢,哈哈哈哈,任乐任乐。 一、安装A...
java实现自动化测试接口访问(一)
一、前置准备: PostMan 访问的网站:Github 访问的接口: https://api.github.com/search/commits?q=committer-date:2017-11-27..2017-12-01&page=1&per_page=100 实现访问:查找2017-11-27到 2017-12-01的100条数据 二、代码实现 1. 使用PostMan输入...
SQLite 真的很容易编译 | Linux 中国
事实证明,这个过程超麻烦(如通常一样),但是非常有趣! -- Julia Evans 上周,我一直在做一个 SQL 网站(https://sql-steps.wizardzines.com/,一个 SQL 示例列表)。我使用 sqlite 运行网站上的所有查询,并且我想在其中一个例子(这个)中使用窗口函数。 但是我使用的是 Ubuntu 18.04 中的 sqlite 版本,它太旧了,不支持窗口函...
