php数据结构课程---5、树(树的 存储方式 有哪些)
php数据结构课程---5、树(树的 存储方式 有哪些)
一、总结
一句话总结:
双亲表示法:data parent:$tree[1] = ["B",0];
孩子表示法:data firstChild:firstChild把他的所有兄弟都用链表存起来
双亲孩子表示法:比孩子表示法,多一个父亲指针。
孩子兄弟表示法:data,存储数据,firstchild第一个孩子节点,rightsib右兄弟节点
1、树的度 是什么意思?
树内各结点的度的 最大值
2、树的 存储方式 中的 双亲表示法 的 代码如何实现,及这种存储方式的 优缺点?
data parent:$tree[1] = ["B",0];
优缺点:便于找到双亲,如果找到孩子则需要遍历所有节点。
<?php //双亲表示法 //
// A
// / \
// B C
// / / \
// D E F
// /|\ \
// G H I J
// $tree = []; $tree[0] = ["A",-1];
$tree[1] = ["B",0];
$tree[2] = ["C",0];
$tree[3] = ["D",1];
$tree[4] = ["E",2];
$tree[5] = ["F",2];
$tree[6] = ["G",3];
$tree[7] = ["H",3];
$tree[6] = ["I",3];
$tree[8] = ["J",4]; echo "<pre>";
var_dump($tree); //双亲表示法.便于找到双亲节点(即父节点)缺点不便于寻找孩子,寻找孩子需要遍历整棵树。
3、树的 存储方式 中的 孩子表示法 的 代码如何实现,及这种存储方式的 优缺点?
data firstChild:firstChild把他的所有兄弟都用链表存起来
$trees[4] = new CTBox("D",new CTNode(0,new CTNode(1,new CTNode(2))));
优缺点:便于查询孩子和兄弟节点,但是查询双亲节点时,显得不方便
节点:index 存储链表/数组 索引下标;next 指向下个兄弟 CTNode 节点;
树:$data 存储节点数据;$firstChild 存储第一个孩子节点 类型为CTNode
<?php //孩子表示法 //节点,
// index 存储链表/数组 索引下标
// next 指向下个兄弟 CTNode 节点
class CTNode{
public $index; //通过索引获取数据值
public $next; public function __construct($index,$ns = null){
$this->index = $index;
$this->next = $ns;
}
} // $data 存储节点数据
// $firstChild 存储第一个孩子节点 类型为CTNode
class CTBox{
public $data;
// public $parent;
public $firstChild; public function __construct($data,$firstChild = null){
$this->data = $data;
$this->firstChild = $firstChild;
}
} //
// A
// / \
// B C
// / / \
// D E F
// /|\ \
// G H I J
// //使用数组存储整棵树
$trees = [];
$trees[0] = new CTBox("G");
$trees[1] = new CTBox("H");
$trees[2] = new CTBox("I");
$trees[3] = new CTBox("J");
// 第一个孩子下标 兄弟下标 兄弟下标
$trees[4] = new CTBox("D",new CTNode(0,new CTNode(1,new CTNode(2))));
// 第一个孩子下标
$trees[5] = new CTBox("E",new CTNode(3));
$trees[6] = new CTBox("F");
// 第一个孩子下标
$trees[7] = new CTBox("B",new CTNode(4));
// 第一个孩子下标 兄弟下标 兄弟下标
$trees[8] = new CTBox("C",new CTNode(5,new CTNode(6)));
$trees[9] = new CTBox("A",new CTNode(7,new CTNode(8))); //找到树D节点,以及D的子树
echo "<pre>";
echo "节点为".$trees[4]->data."的子节点如下:";
echo "<br>";
$index = $trees[4]->firstChild->index;
echo $trees[$index]->data;
echo "<br>";
$index = $trees[4]->firstChild->next->index;
echo $trees[$index]->data;
echo "<br>";
$index = $trees[4]->firstChild->next->next->index;
echo $trees[$index]->data;
4、树的 存储方式 中的 双亲孩子表示法 的 代码如何实现,及这种存储方式的 优缺点?
比孩子表示法,多一个父亲指针:
5、树的 存储方式 中的 孩子兄弟表示法 的 代码如何实现,及这种存储方式的 优缺点?
data,存储数据,firstchild第一个孩子节点,rightsib右兄弟节点:$trees[5] = new CSNode("E",$trees[0],$trees[4]);
<?php // 孩子兄弟表示法 class CSNode{
public $data;
public $child;
public $rightsb; public function __construct($d,$c,$r){
$this->data = $d;
$this->child = $c;
$this->rightsb = $r;
} } //
// A
// / \
// B C
// / / \
// D E F
// /|\ \
// G H I J
// $trees = [];
$trees[0] = new CSNode("J");
$trees[1] = new CSNode("I");
$trees[2] = new CSNode("H",null,$trees[1]);
$trees[3] = new CSNode("G",null,$trees[2]);
$trees[4] = new CSNode("F");
$trees[5] = new CSNode("E",$trees[0],$trees[4]);
$trees[6] = new CSNode("D",$trees[3]);
$trees[7] = new CSNode("C",$trees[5]);
$trees[8] = new CSNode("B",$trees[6],$trees[7]);
$trees[9] = new CSNode("A",$trees[8]);
6、树的遍历方式有哪些?
先根遍历:若树非空,则先访问根结点,再按照从左到右的顺序遍历根结点的每一棵子树。
后根遍历:若树非空,则按照从左到右的顺序遍历根结点的每一棵子树,之后再访问根结点。
7、树有哪些常见的类型?
决策树:比如象棋开局,每个象有两种走法,每个车有两种走法,等等,所以象棋开局有42种走法(各个棋子走法之和),这就是决策树
二叉树:每个结点最多有两个子树的树结构
平衡二叉树:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树
8、决策树是什么?
决策情况:比如象棋开局,每个象有两种走法,每个车有两种走法,等等,所以象棋开局有42种走法(各个棋子走法之和),这就是决策树
9、二叉搜索树/二叉排序树 是什么?
若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
左、右子树也分别为二叉排序树;
10、二叉搜索树/二叉排序树 如何查找节点?
当前节点比要找的值小就去右子树,否者去左子树
11、二叉树的 遍历方式 有哪些?
先序遍历(DLR) 根左右 preOrder
中序遍历(LDR) 左根右 inOrder
后序遍历(LRD) 左右根 postOrder
<?php //
// 8
// / \
// 3 10
// / \ \
// 1 6 14
// / \ /
// 4 7 13
// class tree{
public $data;
public $left = null ;
public $right = null;
public function __construct($data){
$this->data = $data;
} // DLR
public function preOrder(){
echo $this->data." ";
if($this->left)
$this->left->preOrder();
if($this->right)
$this->right->preOrder();
}
// LDR
public function inOrder(){
if($this->left)
$this->left->inOrder();
echo $this->data." ";
if($this->right)
$this->right->inOrder();
}
// LRD
public function postOrder(){
if($this->left)
$this->left->postOrder();
if($this->right)
$this->right->postOrder();
echo $this->data." ";
}
} $trees = new tree(8);
$trees->left = new tree(3);
$trees->left->left = new tree(1);
$trees->left->right = new tree(6);
$trees->left->right->left = new tree(4);
$trees->left->right->right = new tree(7); $trees->right = new tree(10);
$trees->right->right = new tree(14);
$trees->right->right->left = new tree(13); echo "<pre>";
$trees->preOrder();
echo "<br>";
$trees->inOrder();
echo "<br>";
$trees->postOrder();
echo "<br>";
12、二叉树代码如何实现?
$data,$left,$right
class tree{
public $data;
public $left;
public $right;
public function preOrder(){
}
public function inOrder(){
}
Public function postOrder(){}
}
13、树,森林,二叉树之间的如何转换 ?
任何一棵树都可以按照一定的算法转换成二叉树。
任何森林都可以按照一定的算法转换成树,或者二叉树。
拥有了二叉树,调整成平衡二叉搜索树,我们即拥有了o(log2n)的查询效率。
14、树如何转换为二叉树?
(1)加线。就是在所有兄弟结点之间加一条连线;
(2)抹线。就是对树中的每个结点,只保留他与第一个孩子结点之间的连线,删除它与其它孩子结点之间的连线;
(3)旋转。就是以树的根结点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。
15、森林如何转换为二叉树?
(1)先把每棵树转换为二叉树;
(2)变为右孩子节点:第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子结点,用线连接起来。当所有的二叉树连接起来后得到的二叉树就是由森林转换得到的二叉树。
二、内容在总结中
php数据结构课程---5、树(树的 存储方式 有哪些)的更多相关文章
- Mysql存储引擎之TokuDB以及它的数据结构Fractal tree(分形树)
在目前的Mysql数据库中,使用最广泛的是innodb存储引擎.innodb确实是个很不错的存储引擎,就连高性能Mysql里都说了,如果不是有什么很特别的要求,innodb就是最好的选择.当然,这偏文 ...
- 【转帖】LSM树 和 TSM存储引擎 简介
LSM树 和 TSM存储引擎 简介 2019-03-08 11:45:23 长烟慢慢 阅读数 461 收藏 更多 分类专栏: 时序数据库 版权声明:本文为博主原创文章,遵循CC 4.0 BY-S ...
- 数据结构(三) 树和二叉树,以及Huffman树
三.树和二叉树 1.树 2.二叉树 3.遍历二叉树和线索二叉树 4.赫夫曼树及应用 树和二叉树 树状结构是一种常用的非线性结构,元素之间有分支和层次关系,除了树根元素无前驱外,其它元素都有唯一前驱. ...
- Mysql索引数据结构为什么是B+树?
目录 Mysql索引数据结构 二叉树 红黑树 B-Tree B+Tree Mysql索引数据结构 下面列举了常见的数据结构 二叉树 红黑树 Hash表 B-Tree(B树) Select * from ...
- 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树
另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...
- 树后台数据存储(採用webmethod)
树后台数据存储 关于后台数据存储将集中在此篇解说 /* *作者:方浩然 *日期:2015-05-26 *版本号:1.0 */ using System; using System.Collection ...
- Android版数据结构与算法(六):树与二叉树
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 之前的篇章主要讲解了数据结构中的线性结构,所谓线性结构就是数据与数据之间是一对一的关系,接下来我们就要进入非线性结构的世界了,主要是树与图,好了接 ...
- C语言数据结构基础学习笔记——树
树是一种一对多的逻辑结构,树的子树之间没有关系. 度:结点拥有的子树数量. 树的度:树中所有结点的度的最大值. 结点的深度:从根开始,自顶向下计数. 结点的高度:从叶结点开始,自底向上计数. 树的性质 ...
- 1004 Counting Leaves 对于树的存储方式的回顾
一种新的不使用左右子树递归进行树高计算的方法,使用层次遍历 树的存储方式: 1.本题提供的一种思路: 使用(邻接表的思想)二维数组(vector[n])表示树,横坐标表示 父节点,每一行表示孩子. 能 ...
随机推荐
- elasticsearch的基本用法(转载)
本文出自:http://blog.csdn.net/feelig/article/details/8499614 最大的特点: 1. 数据库的 database, 就是 index 2. 数据库 ...
- python批量运行py文件
import os path="E:\\python" #批量的py文件路径 for root,dirs,files in os.walk(path): #进入文件夹目录 for ...
- 结对编程收获-Core10组-PB16110698
本周结对编程追加作业:记录收获.坦白说,我的收获多而杂,一时不知从何说起,以下试图从各方面简要谈谈. 一.编程能力收获 从编程能力方面,我收获的主要是类的设计思路和算法设计.在作业要求blog的指引下 ...
- JS事件 内容选中事件(onselect)选中事件,当文本框或者文本域中的文字被选中时,触发onselect事件,同时调用的程序就会被执行。
内容选中事件(onselect) 选中事件,当文本框或者文本域中的文字被选中时,触发onselect事件,同时调用的程序就会被执行. 如下代码,当选中用户文本框内的文字时,触发onselect 事件, ...
- 数据库MySQL--常见函数
例子文件:https://files.cnblogs.com/files/Vera-y/myemployees.zip 函数:将一组逻辑语句封装在函数体中,对外暴露函数名 调用:select 函数名( ...
- python对urlEncode进行解码
利用python自带的urlib进行编码和解码,没有什么问题.(https://www.hustyx.com/python/) 但如果是用url编码工具(http://tool.chinaz.com/ ...
- BCZM : 1.4
书店促销活动,某套书一共有五卷.假设每一卷单独销售均需8欧元,多买则有折扣,具体折扣如下: 2 5% 3 10% 4 20% 5 25% 设计算法,计算出读者购买一批书的 ...
- jmeter做http请求时报错
在发帖时候发现请求不成功,在察看结果树的响应数据中提示:“”抱歉,您的请求来路不正确或表单验证串不符,无法提交“” 重复看了多次请求,发现Implementation这个地方选择HttpClient3 ...
- day30 python类的继承,抽象类等
Python之路,Day17 = Python基础17-面向对象入门 继承 class Student(People): pass print(Student.__bases__) # 查看 Stud ...
- spingboot linux 启动方式与脚本
java -jar XXX.jar java -jar xxx.jar & 区别:前台启动ctrl+c就会关闭程序,后台启动ctrl+c不会关闭程序 java -jar xxx.jar > ...