利用 地址引用 进行 快速排树 的简单方法

小强们难免会和树打交道, 一提到树, 小强们都会想到用递归. 不可否认,我也写了很多年的递归.

但是递归需要大量的循环.

这里,利用地址引用进行快速排树,只需要一次循环.

1,从儿子找父亲

这是我构造的测试数据:

1,0;2,0;3,1;4,3;5,4;6,5;7,4;8,3;9,8;10,9

儿子,父亲;儿子,父亲;儿子,父亲;.....

 1      var str = "1,0;2,0;3,1;4,3;5,4;6,5;7,4;8,3;9,8;10,9";
 2             var datas = str.Split(new char[] { ‘;‘ })
 3                 .Select(s => {
 4                     var tmp = s.Split(new char[] { ‘,‘ });
 5                     return new {
 6                         ID = tmp[0].ToInt(),
 7                         PID = tmp[1].ToInt()
 8                     };
 9                 });
10
11             var dic = new Dictionary<decimal, Tmp>();
12             foreach (var kv in datas) {
13                 var tmp = new Tmp() {
14                     ID = kv.ID,
15                     PID = kv.PID
16                 };
17
18                 dic.Set(kv.ID, tmp);
19
20                 var parent = dic.Get(kv.PID, new Tmp() {
21                     ID = kv.PID
22                 });
23
24                 tmp.Parent = parent;
25             }
 1         private class Tmp {
 2
 3             public int ID {
 4                 get;
 5                 set;
 6             }
 7
 8             public int PID {
 9                 get;
10                 set;
11             }
12             public Tmp Parent {
13                 get;
14                 set;
15             }
16         }

除构造测试数据外,只用了一次循环,没有嵌套.

ToInt 和 dic.Set 方法是自定义的扩展方法, 只做辅助,和排树没关系.

从根找儿子,没有现成的CS示例,也懒得写, 贴段用于 js treegrid 的代码:

 1     var dealTree = function (tab) {
 2         var rows = tab.rows;
 3         var row;
 4
 5         var treeObjs = {};
 6         var tmp = {};
 7
 8         for (var i = 0; row = rows[i]; i++) {
 9             var id = $(row).attr("data-treegrid-id");
10             var pId = $(row).attr("data-treegrid-parentID");
11
12             if (id == undefined || pId == undefined)
13                 continue;
14
15             if (!tmp[pId])
16                 tmp[pId] = {};
17
18             if (!tmp[id])
19                 tmp[id] = { hasChild: false };
20
21             tmp[id].pID = pId;
22
23             tmp[pId][id] = tmp[id];
24             tmp[pId].hasChild = true;
25         }
26
27         for (var t in tmp) {
28             if (tmp[t].pID == undefined) {
29                 treeObjs[t] = tmp[t];
30             }
31         }
32
33         return treeObjs;
34     }

原理都一样.

写这个东东,主要是从网上找不到适用于直接套在 table 上的 treegrid, 要么是从 json 构造树表,要么是必须先排好行的顺序,用着都很蛋疼.我就需要一个能直接在现有 table 上自动排树的一个表格的功能而以.找了很久都没找到满意的,只能自己动手了:

  1 var Treegrid = {};
  2 (function (t) {
  3
  4     var self = this;
  5
  6     var dealTree = function (tab) {
  7         var rows = tab.rows;
  8         var row;
  9
 10         var treeObjs = {};
 11         var tmp = {};
 12
 13         for (var i = 0; row = rows[i]; i++) {
 14             var id = $(row).attr("data-treegrid-id");
 15             var pId = $(row).attr("data-treegrid-parentID");
 16
 17             if (id == undefined || pId == undefined)
 18                 continue;
 19
 20             if (!tmp[pId])
 21                 tmp[pId] = {};
 22
 23             if (!tmp[id])
 24                 tmp[id] = { hasChild: false };
 25
 26             tmp[id].pID = pId;
 27
 28             tmp[pId][id] = tmp[id];
 29             tmp[pId].hasChild = true;
 30         }
 31
 32         for (var t in tmp) {
 33             if (tmp[t].pID == undefined) {
 34                 treeObjs[t] = tmp[t];
 35             }
 36         }
 37
 38         return treeObjs;
 39     }
 40
 41     var getSubIds = function (treeObjs, arr) {
 42         for (var t in treeObjs) {
 43             if (typeof (treeObjs[t]) != "object")
 44                 continue;
 45
 46             arr.push(t);
 47
 48             if (treeObjs[t].hasChild)
 49                 getSubIds(treeObjs[t], arr);
 50         }
 51         return arr;
 52     }
 53
 54     var generate = function (treeObjs, tab, tbody, level) {
 55         for (var t in treeObjs) {
 56             var node = treeObjs[t];
 57
 58             if (typeof (node) != "object")
 59                 return;
 60
 61             var row = $(tab).find("tr[data-treegrid-id=" + t + "]");
 62             var td = row.find("td:eq(0)");
 63             var indents = new Array(level).join("<span class=‘treegridIndent‘></span>");
 64
 65             var htmls = [indents];
 66
 67             if (node.hasChild) {
 68                 var subIds = getSubIds(node, new Array());
 69                 htmls.push("<span data-treegrid-subs=‘" + subIds.join(",") + "‘ class=‘glyphicon glyphicon-chevron-down‘></span>")
 70             }
 71             htmls.push(td.html());
 72
 73             td.html(htmls.join(""));
 74             tbody.append(row);
 75             generate(node, tab, tbody, level + 1);
 76         }
 77     }
 78
 79     var init = function (tab) {
 80         if ($(tab).attr("data-treegrid-dealed") == true)
 81             return;
 82
 83         var treeObjs = dealTree(tab);
 84
 85         var tbody = $("<tbody>");
 86
 87         generate(treeObjs, tab, tbody, 0);
 88         $(tab).append(tbody);
 89         $(tab).attr("data-treegrid-dealed", true);
 90     }
 91
 92     $.fn.treegrid = function () {
 93         this.each(function () {
 94             init(this);
 95         });
 96
 97         $("span[data-treegrid-subs]").on("click", function () {
 98             var subIds = $(this).attr("data-treegrid-subs").split(‘,‘);
 99             var explanded = $(this).data("data-treegrid-expandend");
100             explanded = explanded == undefined ? true : explanded;
101             var id;
102             for (var i = 0; id = subIds[i]; i++) {
103                 var tr = $("tr[data-treegrid-id=‘" + id + "‘]");
104                 tr.toggle(!explanded);
105             }
106             $(this)
107                 .data("data-treegrid-expandend", !explanded)
108                 .removeClass("glyphicon-chevron-right").removeClass("glyphicon-chevron-down")
109                 .addClass(explanded ? "glyphicon glyphicon-chevron-right" : "glyphicon glyphicon-chevron-down");
110         });
111     }
112
113 })(Treegrid);

最终效果长这样,丑是丑了点,但是简单.

谢谢围观.

利用 地址引用 进行 快速排树 的简单方法

时间: 2024-10-05 05:08:00

利用 地址引用 进行 快速排树 的简单方法的相关文章

利用窗口引用漏洞和XSS漏洞实现浏览器劫持

==Ph4nt0m Security Team==                        Issue 0x03, Phile #0x05 of 0x07 |=---------------------------------------------------------------------------=||=---------------=[ 利用窗口引用漏洞和XSS漏洞实现浏览器劫持 ]=---------------=||=---------------------------

Android开发之图片处理专题(一):利用软引用构建图片高速缓存

在Android开发中,图片处理是一个难点.对于大量的图片处理,一不小心就会出现OOM的错误.那么,构建缓存,就是非常必要的一个手段.利用软引用构建缓存,只是其中步骤之一,我们来看看一般情况下,图篇处理的流程. 一般而言,图片的处理流程大致如上,之前所说的Xutils的原理,也如此.今天,我们就先讲讲如何利用软引用技术来构建高速缓存. 一.对象的四种引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态

Java 如何有效地避免OOM:善于利用软引用和弱引用

原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种错误如何有效地解决这个问题呢?今天我们就来说一下如何利用软引用和弱引用来有效地解决程序中出现的OOM问题.下面是本文的目录大纲: 一.了解 强引用.软引用.弱引用.虚引用的概念 二.进一步理解软引用

java 关于值引用、地址引用的问题

8种基本引用类型 四种整数类型(byte.short.int.long) 两种浮点数类型(float.double) 一种字符类型(char) 一种布尔类型(boolean) 以及如String, final类型的数据类型时. 在方法调用时,属于值传递,在方法中改变了值之后,原始值不会改变. 除了以上之外的数据类型,如自定义的对象,Map,List之类的引用,都是地址引用. 如下demo: import java.util.ArrayList; import java.util.HashMap;

引用CSS文件到html网页里方法

引用CSS文件到Html方法-css引入,css引用 使用不同的方法来引用css样式表,最终到达的效果相同,但是使用不同方法应用的css文件将影响到SEO及网页打开速度效率. html引用css方法如下1.直接在div中使用css样式制作div+css网页2.html中使用style自带式3.使用@import引用外部CSS文件4.使用link引用外部CSS文件 推荐此方法 扩展阅读:link与import区别 接下来我们将逐个讲解html引用css方法的例子 1.直接在html标签元素内嵌入c

修改ubuntu和windows的ip地址使二者能相互ping通的方法 &nbsp;

一,永久修改ubuntu的ip地址的方法: ubuntu的网络配置信息保存在/etc/network/interfaces 下,应此要永久地修改ubuntu的ip地址首先必须修改这个配置文件,打开ubuntu的终端登录root权限,然后输入命令:geany /etc/network/interfaces 打开这个配置文件,把下面的内容复制进去并替换里面原有的内容: # interfaces(5) file used by ifup(8) and ifdown(8) auto eth0   #if

Android中利用icodetools工具快速定位App破解中关键点方法

icodetools工具地址:https://github.com/fourbrother/icodetools 一.前言 在前面已经介绍了icodetools工具的实现原理和具体使用规则,关于这部分的知识点还不了解的同学可以去下面两篇文章详细查看:Android中注入代码工具icodetools原理篇,Android中注入代码工具icodetools完善篇.同时这个工具已经放到github上了,感兴趣的同学可以下载尝试各种app的代码注入功能. 那么有了这两篇文章之后,现在我得实际操作了,要动

利用移位、加减法实现整数开平方算法的方法(转)

利用移位.加减法实现整数开平方算法的方法(转) 本算法只采用移位.加减法.判断和循环实现,因为它不需要浮点运算,也不需要乘除运算,因此可以很方便地运用到各种芯片上去. 我们先来看看10进制下是如何手工计算开方的.先看下面两个算式,x = 10*p + q  (1)公式(1)左右平方之后得:x^2 = 100*p^2 + 20pq + q^2 (2)现在假设我们知道x^2和p,希望求出q来,求出了q也就求出了x^2的开方x了.我们把公式(2)改写为如下格式:q = (x^2 - 100*p^2)/

最快最有效的丰胸方法

现在是“胸霸天下”的时代,丰满的胸部是展现一个女性魅力的最佳武器!看娱乐圈有多shao女明星靠丰满的胸部上位,再看网络上又有多少mei女凭ru沟走红?!一直以来,我都渴望像范冰冰那个的胸部,是那样的性感魅惑,而我却只是孙燕姿的类型,胸前是那样的一马平川.最快最有效的丰胸方法?还在为你平平的飞机场发愁吗?还是没有办法挺胸找回自信吗?『亦姿佳美乳霜』让你靓丽自信! 有哪个男人会对自己老婆的胸毫不在乎的呢?我想没有吧,产后吃什么东西能丰胸?自从生完宝宝之后,我的胸就开始变得缩小干瘪,我自己并不是非常在