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])表示树,横坐标表示 父节点,每一行表示孩子. 能 ...
随机推荐
- css之页面三列布局之左右上下高度固定,中间自适应
第一种,绝对定位 !DOCTYPE HTML> <html> <head> <meta charset="gb2312"> <tit ...
- 测试用例覆盖率converage
当报如下错误: TypeError: 'ModuleImportFailure' object is not iterable 或者 TypeError: '_FailedTest' object i ...
- Android开发 MediaPlayer播放raw资源MP3文件
代码 private MediaPlayer mRingPlayer; /** * 播放铃声 */ private void startRing(){ if (mRingPlayer != null) ...
- vs2013x64&&qt5.7.1编译osg3.4.0&&osgEarth2.7
此文仅备忘: 1.安装VS2013_Cn_Ult 2.安装qt-opensource-windows-x86-msvc2013_64-5.7.1 设置环境变量QTDIR,并将其bin加入到path中. ...
- Maven - Scope区别
依赖的Scope scope定义了类包在项目的使用阶段.项目阶段包括: 编译,运行,测试和发布. 分类说明 compile 默认scope为compile,表示为当前依赖参与项目的编译.测试和运行阶段 ...
- MySQL 其他基础知识
-- 查询存储引擎show engines;-- 显示可用存储引擎show variables like 'have%'; -- concat多个字段联合select tname ,cname ,co ...
- 如何查看redis占用内存大小
redis缓存固然高效,可是它会占用我们系统中宝贵的内存资源,特别是当我们的项目运行了一段时间后,我们需要看一下redis占用了多少内存,那么可以用“info”命令查看. 执行info命令后,找到Me ...
- 资源-Android:Android
ylbtech-资源-Android:Android 1.返回顶部 1. https://developer.android.google.cn/studio 2. 2.返回顶部 1. 1.1 1.2 ...
- SpringCloud学习笔记(八):Zuul路由网关
概述 是什么? Zuul包含了对请求的路由和过滤两个最主要的功能: 其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负责对请求的处理过程进行干预,是实现请 ...
- 16.ajax_case06
# 抓取华尔街见闻实时快讯 # https://wallstreetcn.com/live/global?from=navbar import requests import json header ...