My Little World

learn and share


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于
My Little World

阿里巴巴iconfont使用

发表于 2017-02-18

1.登录http://iconfont.cn/plus/home/index?spm=a313x.7781069.1998910419.2.QImsN2 进入搜索界面
2.通过输入关键字搜索自己想要的图标
3.将鼠标放到自己想要的图标会出现选择层,点击第一个购物车图标,添加入库
4.将所有想要的图标添加完后,点击右上角购物车图标打开项目添加页,点击“加入项目”右侧图标,为选择的图标新建项目,点确定
iconfont1
iconfont2
5.关闭项目添加页,点击导航栏的“图标管理”,进入“我的项目”栏目


图片名称
图片名称

6.使用图标到我们的HTML代码中,可以通过线上链接使用,也可以通过下载至本地使用

通过线上链接使用

1.点击查看在线链接,复制代码到项目的静态资源的css文件中一般在src/assets/css路径下的文件
2.设置一个类icon,通过这个类的属性改变图标样式,同时在HTML中引用这个类

1
2
3
4
5
6
7
8
9
10
11
.icon {
font-family: "iconfont" !important;
font-style: normal;
display: inline-block;
vertical-align: middle;
background-size: 100% auto;
background-position: center;
-webkit-font-smoothing: asntialiased;
-webkit-text-stroke-width: 0.2px;
-moz-osx-font-smoothing: grayscale;
}

3.在标签中添加icon类,在标签中间加入图标代码,例如: 

下载至本地

1.点击下载至本地
2.将在线链接代码中用到的文件放到项目静态文件夹中,
3.将在线链接代码中文件的路径更改为项目中的文件路径,
4.其他步骤同线上路径
5.也可直接打开下载文件的IconFontDemo/assets/iconfont/的demo.html代码,看如何使用

My Little World

git问题处理

发表于 2017-02-18 | 分类于 categories

git pull 更新代码出现问题

1
2
3
4
5
6
7
8
9
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

git branch --set-upstream-to=origin/<branch> develop_hotfix

解决办法
git branch -D 分支名 ##删除本地待更新分支
git checkout 分支名 ##将待更新分支切回来
Git pull 再更新

git remote add origin 遇到远程分支已存在的情况

解决办法
git remote rm origin ##先删除远程分支
git remote add origin 地址 ## 再修改远程仓库地址

git push 遇到问题

1
fatal: unable to access 'https://github.com/YooHannah/WeiXindemo.git/': Failed to connect to github.com port 443: Timed out

解决办法
先删除远程分支 git remote rm origin
再将本地分支的上游分支设置为远程分支同时push
git push –set-upstream origin master
以后再执行git push 就不会出现报以上错误或一直没反应的状况

1
error:src refspec master does not match any

只进行了init,没有add和commit,本地版本库为空, 空只进行了init,目录不能提交

1
2
3
If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.

解决方法:
rm -f ./.git/index.lock

npm 运行项目错误

npm run dev error [npm ERR! code ELIFECYCLE]
node_modules安装问题,执行以下:
rm -rf node_modules rm package-lock.json npm cache clear –force npm install

git merge 之后,git commit 出现问题

husky > pre-commit hook failed (add –no-verify to bypass)
git merge 之后,git commit 出现问题,解决:
出现这样的原因在于楼主使用了husky,并且配置了”precommit”: “npm run lint”
因此会在你git commit的时候执行npm run lint 也就是eslint –ext .js src test
如果报错的话,会返回非0,从而组织代码commit。
因此有两种方式解决:

  1. 执行npm run lint, 根据提示修改错误,如果是其他人的报错,请求别人协助(推荐)
  2. git commit -m ‘’ -n 强制推送
    3.更新远程分支列表
    git remote update origin –prune

IE报vuex requires a Promise polyfill in this browser问题解决

第一步: 安装 babel-polyfill 。 babel-polyfill可以模拟ES6使用的环境,可以使用ES6的所有新方法
npm install –save babel-polyfill
第二步: 在 Webpack/Browserify/Node中使用
在webpack.config.js文件中,使用
module.exports = {
entry: {
app: [“babel-polyfill”, “./src/main.js”]
}
};

git 分支处理

背景

A同学提交了两次代码,但在第二次提交代码前,B同学有提交自己的代码,并且在合并代码时,
将A同学第一次提交的代码merge丢弃了,导致A同学第一次代码无法合并到主分支

原理知识

git reset 可以撤销commit命令的提交
git rebase 把分叉提交历史’整理’成一条直线
git stash 可以把工作现场’储藏起来’,等以后恢复现场后可以继续工作

分析

在分支代码处理时,A同学本地有主分支host(公共分支)和自己的本地分支local,
工作流程是
在自己本地分支local分支开发完毕后,
切换host分支,git pull 拉取远端分支更新后,
将本地分支local合并merge到host分支
然后git push到远端

而B同学直接在本地的主分支(公共分支)开发,git push时冲突,
git pull 拉取远端A同学第一次的代码时,直接将代码变更进行了丢弃
然后push了自己的代码到远端分支

A同学第二次提交时,并不知道B同学丢弃了自己第一次提交的代码,
在进行第二次提交时,在host上拉取远程更新之后,
继续合并推送最终结果就是自己的第一次代码丢失了

解决

利用A同学本地分支local没有合并远程分支的间隙,将A同学的两次提交保存下来,回到两次提交前的状态
然后拉取B同学的提交,再将A同学的两次提交拿出来进行合并,这样就可以实现三次提交都保存下来,再提交到远端

在A同学的本地分支进行操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1.在主分支host上取消第二次提交
git reset --hard HEAD~1

2.将远端第二次提交撤销掉,让分支保留在B同学提交的状态
git push --force

3.切换本地分支local,回滚版本到两次提交前
git reset HEAD^^

4.保存两次提交 可以通过git stash list查看保存状态
git stash
git stash list

5. 合并主分的B同学的提交到本地分支local,这时本地分支就有B同学的代码变更了
6. 取出A同学的两次提交,与B同学代码进行提交
git stash pop
7. 切换主分支host,合并本地分支local,推送到远端

My Little World

git使用

发表于 2017-02-15

链接虚拟机基本步骤

1.打开git bash
2.执行命令“ssh root@环境地址” 例:ssh root@172.16.6.213
3.输入对应密码
4.执行命令“cd 代码在该虚拟机的存放路径” 例:cd /usr/share/nginx/html/projrctname
5.git branch #查看本地分支
6.git checkout 分支名 #切换分支
7.git pull 更新代码

更新远程仓库地址

命令行界面操作

显示当前远程仓库:git remote -v
删除当前远程仓库:git remote remove origin
添加新的远程仓库:git remote add origin 远程仓库地址
git1

使用source tree

1.在 SourceTree 里打开对应的代码库。
2.点击右上角设置按钮
git2
3.点击选择当前远程仓库路径,编辑和移除按钮恢复可用,点击“移除”
4.点击“新建”,“远程(仓库)名称”填入“origin”,“URL/路径”填入项目在Git服务器的地址
5.点击“确定”
6.点击设置页面”确定”
git3

My Little World

赫夫曼编码

发表于 2017-02-12

赫夫曼编码可以构造出一种不等长的二进制,使编码后的电文长度最短,且保证不产生二义性

赫夫曼树

相关定义

权:树结点间的连线相关的数
结点的路径长度:从根结点到该结点的路径上的连接数
树的路径长度:树中每个叶子结点的路径长度之和
结点带权路径长度:结点的路径长度与结点权值的乘积
树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之和。 WPL越小,说明二叉树性能越优。

构造赫夫曼树

1.在森林中选出两颗根结点的权值最小的二叉树,权值小的放左边,权值大的放右边
2.合并两颗选出的二叉树:增加一个新结点n作为新二叉树的根,权值为左右孩子权值之和
3.回到森林中,选出权值最小的根结点,与刚刚形成的结点n比较,小的放左边,大的放右边
4.返回步骤二,直到森林中的树被选完


图片名称
图片名称

赫夫曼编码

一些名词

定长编码:规定位数表示字符
变长编码:单个编码长度不一字,可以根据整体出现频率来调节
前缀码:没有任何码字是其他码字的前缀

赫夫曼编码思路

1.根据输入字符串,统计字符出现次数,建立优先级队列
2.根据优先级队列建立输入字符串的赫夫曼树
3.遍历赫夫曼树,左1右0,建立字符编码表
4.编码encode:根据字符编码形成字符串编码
5.解码decode:根据编码字符串遍历赫夫曼树,左0右1,找到叶子结点的字符,从而解码字符。
代码链接

My Little World

利用checkbox进行各种勾选

发表于 2017-02-12

单选

1
2
3
4
5
html:
<div ng-repeat="item in labels track by $index" style="padding-left: 50px">
<label class="mt-checkbox mt-checkbox-single mt-checkbox-outline" ><input type="checkbox" ng-model="item.isSelected" ng-click="updateSingelSelection($index,labels)" /><span></span></label>
<label>{{item.name}}</label>
</div>

val1为选定值的key,或者叫序号,val2为选项集合

1
2
3
4
5
6
7
 $scope.updateSingelSelection = function(val1, val2) {
$scope.label = val2[val1]; //对选定的值做处理
angular.forEach(val2, function(x, index) { //处理其他选项为未选状态
if (val1 != index)
x.isSelected = false;
});
}

checkbox1

多选

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<div class="portlet-body dataTables_wrapper" style="margin: -20px 20px 0px 20px;" ng-if="detaildata.goods.length>0">
<div class="table-scrollable">
<table class="table table-bordered table-hover no-footer">
<thead>
<tr role="row" class="heading">
<th>ID</th>
<th>
<label class="mt-checkbox mt-checkbox-single mt-checkbox-outline"><input type="checkbox" ng-model="detaildata.goods.allchecked" ng-change="selectall()"/><span></span></label>
</th>
</tr>
</thead>
<tbody>
<tr role="row" ng-repeat="item in detaildata.goods track by $index">
<td>{{item.id}}</td>
<td>
<label class="mt-checkbox mt-checkbox-single mt-checkbox-outline"><input type="checkbox" ng-model="item.checked" ng-click="UpdateSelection($index)"/><span></span></label>
</td>
</tr>
</tbody>
</table>
</div>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 $scope.UpdateSelection = function(index){
if($scope.detaildata.goods[index].checked){

tempdata2.push($scope.detaildata.goods[index]); //处理选中项

if(tempdata2.length == $scope.detaildata.goods.length){ //判断是否满足全选条件, $scope.detaildata.goods.allchecked = true; //满足则将全选按钮设置为勾选状态
}else{
$scope.detaildata.goods.allchecked = false; //否则为未选状态
}
} else {
$scope.alldata.goods[index].checked = false; //全选按钮设为
angular.forEach(tempdata2, function(list,num){
if($scope.detaildata.goods[index].deal_id == list.deal_id){
tempdata2.splice(num,1);
$scope.detaildata.goods.allchecked = false;
return;
}
});

}
}


图片名称
图片名称

全选

注意:若全选按钮放在表格里,那全选按钮的绑定值S也一定要是整个表格绑定值A的一个属性,即,A.S是全选按钮绑定值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$scope.selectall = function(){
if($scope.detaildata.goods.allchecked){
for(var i = 0;i < $scope.detaildata.goods.length;i++){
$scope.detaildata.goods[i].checked = true; //把每个备选项处理为已选状态
var num = 0;
for(var j = 0;j < tempdata2.length;j++){
if($scope.detaildata.goods[i].deal_id != tempdata2[j].deal_id){
num = num+1;
}else{
num = num;
}
}
if(num == tempdata2.length){
tempdata2.push($scope.detaildata.goods[i]); //将所有为选择的数据处理到临时集合
}
}
}else{
for(var i = 0;i < $scope.detaildata.goods.length;i++){
$scope.detaildata.goods[i].checked = false; //把每个备选项处理为未选状态
}
tempdata2 = []; //清空临时集合
}
}

勾选方法提炼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
//表格勾选 tempdata勾选数据集合,data所有待选数据集合,status勾选状态,keyword数据标志属性
APP.factory('selectAll', function(){
//全选按钮的勾选
var allChoose = function (tempdata,data,status,keyword1,keyword2) {
if(status){
for(var i = 0;i < data.length;i++){
data[i].isSelected = true; //把每个备选项处理为已选状态
var num = 0;
for(var j = 0;j < tempdata.length;j++){
if(data[i][keyword1] != tempdata[j][keyword2]){
num = num+1;
}else{
num = num;
}
}
if(num == tempdata.length){
tempdata.push(data[i]); //将所有未选择的数据处理到临时集合
}
}
}else{
for(var i = 0;i < data.length;i++){
data[i].isSelected = false; //把每个备选项处理为未选状态
angular.forEach(tempdata, function(item,num){
if(data[i][keyword1] == item[keyword2]){
tempdata.splice(num,1);
}
});
}
}
return {
'tempdata':tempdata,
'data':data
};
};

//检查是否满足全选
var checkAll = function (tempdata,data,keyword1,keyword2) {
var temp =0;
angular.forEach(data, function(item){
item.isSelected = false;
angular.forEach(tempdata, function(term){
if(item[keyword1] == term[keyword2]){
item.isSelected = true;
temp +=1;
}
});
});
if(temp == data.length){
return {
'allChecked':true,
'data':data,
'tempdata':tempdata
};
}else{
return {
'allChecked':false,
'data':data,
'tempdata':tempdata
};
}
};

//单项勾选
var UpdateSelection = function(tempdata,data,index,keyword1,keyword2){
if(data[index].isSelected){ //添加选中
tempdata.push(data[index]);
}else{
angular.forEach(tempdata, function(item,num){
if(data[index][keyword1] == item[keyword2]){
tempdata.splice(num,1);
}
});
}
return checkAll(tempdata,data,keyword1,keyword2)
};

//众多选项单选
var singleSelection = function (choseindex,data) {
angular.forEach(data, function(x, index) {
if (choseindex != index)
x.isSelected = false;
});
return data;
};

return {
'allChoose': allChoose,
'checkAll':checkAll,
'UpdateSelection':UpdateSelection,
'singleSelection':singleSelection
};
})
My Little World

树、森林和二叉树的转换与遍历

发表于 2017-02-12

树转化为二叉树


图片名称
图片名称

1.在树中所有的兄弟结点之间加一连线
2.对每个结点,除了保留与其长子的连线外,去掉该结点与其他孩子的连线
3.调整位置结构(顺时针旋转一定角度),变成只有左子树的二叉树

森林转化为二叉树


图片名称
图片名称

1.先将森林中的每颗树变为二叉树
2.再将各二叉树的根结点视为兄弟从左至右连在一起
3调整位置结构,形成拥有左右子树的二叉树

二叉树转化树、森林

1.若结点x是其双亲y的左孩子,则把x的右孩子,右孩子的右孩子,……,都与y用连线连起来
2.去掉所有双亲到右孩子之间的连线
注意:如二叉树有右孩子则将转化为森林,反之转化为普通树

树的遍历

tree3
1.先根遍历
先访问树的根结点,然后再依次先跟遍历每颗子树
ABEFCGDHIJ
2.后根遍历
先依次遍历每颗子树,然后再访问根结点
EFBGCHIJDA

森林遍历

1.前序遍历:按树的先根遍历
2.后续遍历:按树的后跟遍历

小结:
树、森林的前根遍历和二叉树前序遍历结果相同,
树、森林的后根遍历和二叉树的中序遍历相同,
因此对于树、森林的遍历可以转化为二叉树的遍历

My Little World

线索二叉树

发表于 2017-02-11

节省叶子结点空指针浪费的空间,来记录该结点按遍历顺序的前驱后继
只有中序遍历满足每隔一个结点会出现一个浪费空间的结点

结点由五个属性组成;{
lchild:取决于ltag
ltag:为0时,lchild指向该结点左孩子,为1时lchild指向该结点的前驱
data:该结点数据
rchild:取决于rtag
rtag:为0时,rchild指向该结点右孩子,为1时rchild指向该结点的后继
}

代码链接

My Little World

小插件使用

发表于 2017-02-11

ng-clip/angularjs点击复制插件

插件所需js文件链接
用法:
1.在将要使用的控制器里配置好插件文件
2.在HTML里用data-clipboard-text绑定要复制的值,并用class或者id绑定复制动作所在的标签

1
<a  class="font-green-meadow clicopy" data-clipboard-text="{{x.scan_url}}" ><i class="fa fa-copy"></i> 复制扫描链接</a>

3.在控制器里面初始化复制插件对象,并写回调函数

1
2
3
4
5
6
7
8
9
10
11
12
13
//复制链接
$scope.copy = function(){
var clipboard = new Clipboard('.clicopy');
clipboard.on('success', function(e) {
toastr.success('复制成功!','成功');
e.clearSelection();
});

clipboard.on('error', function(e) {
toastr.error('复制失败!','失败');
});
}
$scope.copy();

md5 加密处理

所需文件
用法:
var hash = hex_md5($scope.password);
其实加密文件就是一个算法文件,加密算法也分好多种,所以不同算法加密加载不同的算法文件即可
nodejs的Crypto模块是一个加密模块,也可用于加密处理
相关链接

My Little World

二叉树

发表于 2017-02-11

二叉树

定义

定义:是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个
根节点和两颗不互相交的、分别称为根的左子树和右子树的二叉树
特点:
-每个结点最多有两颗子树,不存在度大于2的结点
-左右子树有顺序,次序不能颠倒,即使只有一颗子树也要区分它是左子树还是右子树

五种基本形态:

空二叉树
只有一个根节点
根结点只有左子树
根结点只有右子树
根结点既有左子树又有右子树

特殊二叉树

1.斜树:只有左子树或只有右子树
2.满二叉树:该二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上
–特点:
1.叶子只能出现在最下一层
2.非叶子结点的度一定是2
3.在同样深度的二叉树中,满二叉树的节点个数一定最多,同时叶子也最多
3.完全二叉树:对一颗具有N个结点的二叉树按层序编号,如果编号为i(i<=i<=n)的结点与同样深度的满二叉树中编号为i的
结点位置完全相同,则这棵树称为完全二叉树
–特点:
1.叶子结点只能出现在最下两层
2.最下层的叶子一定集中在左部连续位置
3、倒数第二层,若有叶子结点,一定都在右部连续位置
4.如果结点度为1,则该结点只有左孩子
5.同样结点数的二叉树,完全二叉树的深度最小
满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树

二叉树存储结构

顺序结构

用数组存储,按层序遍历对比满二叉树顺序,没有结点的位置数组在该位置填空
btree1

二叉链表

每个结点包含一个数据域和两个指针域,两个指针分别指向该结点左右孩子结点
btree2

1
2
3
4
5
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,8BiTree;

二叉树的遍历

btree3
从根结点出发,按照某种次序访问二叉树中所有结点,使每个结点被访问一次且仅被访问一次
1.前序遍历:根左右
若二叉树为空,则空操作返回;否则先访问根结点,然后前序遍历左子树,再前序遍历右子树
a.先访问根结点,然后访问根结点的左孩子
b.将根结点的左孩子视作子树根结点,继续访问其左孩子,再以这个左孩子结点为根再访问其左孩子直到叶结点
c.访问完该叶结点后,再访问该叶结点双亲的右孩子,
d.如果没有右孩子,则该子树访问完毕,继续访问该结点双亲的双亲的右孩子,再以该右孩子为根继续从步骤a开始访问
核心:从整棵树的根结点开始,每次将左孩子看成子树根结点,从上到下,从左到右
ABDHIEJCFKG
2.中序遍历 :左根右
若二叉树为空,则空操作返回;否则从根节点根结点开始(并不是先访问根结点),然后中序遍历左子树,然后访问根结点,再中序遍历右子树
核心:无论什么级别的子树树都从最左端叶结点开始,按左孩子,双亲,右孩子顺序遍历,从下到上,从左到右
HDIBEJAFKCG
3.后序遍历 :左右根
若二叉树为空,则空操作返回;否则从左到右先叶子结点的方式遍历左右子树,最后访问根结点
核心:从最左端叶结点开始,按左孩子,右孩子,双亲顺序遍历,从左到右,从下到上
HIDJEBKFGCA
4.层序遍历
若二叉树为空,则空操作返回;否则从根节点开始,按层依次往下,每层从左到右依次遍历

二叉树的性质

性质一:在二叉树的第i层上至多有2^(i-1)个结点(i>=1)
性质二:深度为K的二叉树至多有2^K-1个结点(K>=1)
性质三:对于任何一颗二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1
性质四:具有n个结点的完全二叉树的深度为log2n取下限加1
性质五:如果对一颗有n个结点的完全二叉树(其深度为log2n取下限加1)的结点按层序编号对任一结点i(1<=i<=n)有以下性质
如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是结点i/2取下限
如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是结点2i
如果2i+1>n,则结点i无右孩子(结点i为叶子结点);否则其右孩子是结点2i+1

计算:
输出指定结点在该树中所在的层数
btree4
[未完成]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
var str="AB DEC #";//约定前序遍历输入
var btree = {
data:'',
lchild:{},
rchild:{}
};
console.log(btree);
function creatbtree(num,item){
console.log(str[num])
if(str[num]=="#");
{
return
}
if(str[num] == " "){
item = null;
}else{
item.data = str[num];
num+=1;
item.lchild ={
data:'',
lchild:{},
rchild:{}
}
creatbtree(num,item.lchild);
num+=1;
item.rchild ={
data:'',
lchild:{},
rchild:{}
}
creatbtree(num,item.rchild);
}
}
creatbtree(0,btree);
console.log(btree.rchild)

My Little World

关于树的一些定义

发表于 2017-02-08

树

tree1
定义:n(n>=0)个结点的有限集。当n=0时称为空树,在任意一颗非空树中:
——有且仅有一个特定的结点称为根
——当n>1时,其余结点可分为m(m>0)个互不相交]的有限集T1、T2…Tm,其中每一个集合本身又是一颗树,并且称为根的子树
结点:图中每一个圆圈称为树的一个结点
结点的度:结点拥有的子树数称为该结点的度
树的度:树内各结点度的最大值
叶结点/终端结点:度为0的结点
分支结点/非终端结点:度不为0的结点
内部结点:分支结点中除根节点以外的结点
结点的孩子:D是B的孩子
孩子的双亲:B是D的双亲
兄弟:D和E互称为兄弟
结点的祖先:从根到该结点所经过分支上的所有结点
结点的层次:从根开始定在一起,根为第一层,根的孩子为第二层
树的深度/高度:树中结点的最大层次,图中树的深度为3
有序树:如果将树中结点的各子树看成从左至右是有次序的不能互换的,则称该树为有序树,否则称为无序树
森林:m(m>=0)棵互不相交的树的集合。对树中每个结点而言,其子树的集合即为森林

tree2
以下遍历采用层序遍历

双亲表示法

每个结点由该结点数据和该结点双亲的下标组成,根结点双亲下标赋值为-1

下标 data parent
0 A -1
1 B 0
2 C 0
3 D 0
4 E 1
5 F 3
6 G 3
7 K 6
8 H 4
9 I 4
10 J 4

孩子表示法

每个结点由该结点数据和该结点双亲的下标、该结点孩子的下标组成,根结点双亲下标赋值为-1
无孩子则孩子属性赋值-1

下标 data parent children
0 A -1 1,2,3
1 B 0 4
2 C 0 -1
3 D 0 5,6
4 E 1 8,9,10
5 F 3 -1
6 G 3 -1
7 K 6 -1
8 H 4 -1
9 I 4 -1
10 J 4 -1

兄弟表示法

每个结点由该结点数据和该结点双亲的下标、该结点兄弟的下标组成,根结点双亲下标赋值为-1
无兄弟则兄弟属性赋值-1

下标 data parent rightsib
0 A -1 -1
1 B 0 2
2 C 0 3
3 D 0 -1
4 E 1 5
5 F 3 6
6 G 3 -1
7 K 6 -1
8 H 4 9
9 I 4 10
10 J 4 -1

双亲孩子表示法

所有结点组成一个数组,每个结点包含该结点数据属性,该结点双亲属性(由双亲结点下标表示)以及第一个孩子结点的下标
每一个孩子结点包含下一个孩子结点的下标,用js数组实现相当于兄弟表示法

下标 data parent nextchildren
0 A -1 -1
1 B 0 2
2 C 0 3
3 D 0 -1
4 E 1 5
5 F 3 6
6 G 3 -1
7 K 6 -1
8 H 4 9
9 I 4 10
10 J 4 -1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# define MAX_TREE_SIZE 100
typedef char ElemType;
//孩子结点
typedef struct
{
int child; //孩子结点的下标
struct CTNode *next; //指向下一个孩子结点的指针
}*ChildPtr;

//表头结构
typedef struct
{
ElemType data; //存放在树中的结点数据
int parent; //存放双亲的下标
ChildPtr firstchild; //指向第一个孩子的指针
}
//树结构
typedef struct
{
CTBox nodes[MAX_TREE_SIZE];//结点数组
int r,n;
}

js实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var tree=[];
for(var i =0;i<11;i++){
var prior = -1;
var next = [];
if(i==0){
prior =-1;
}else if(i>0&&i<4){
prior = 0;
}else if(i==4){
prior = 1;
}else if(i==5 || i==6){
prior = 3;
}else if(i>6 && i<10){
prior = 4;
}else{
prior = 6;
}
tree.push({
data:i,
parent:prior,
});
}
for(var i =0;i<11;i++){
var children=[];
for(var j =0;j<11;j++){
if(tree[j].parent == i){
children.push(j);
}
}
tree[i].children = children.slice();
}
console.log(tree);

1…222324…27
YooHannah

YooHannah

264 日志
1 分类
23 标签
RSS
© 2025 YooHannah
由 Hexo 强力驱动
主题 - NexT.Pisces