层序遍历在ExtJs的TreePanel中的应用


Posted in Javascript onOctober 16, 2009

原理非常简单,就是树的层序遍历,在遍历过程中遇到第一个叶子节点即完成工作。

效果如下图:
层序遍历在ExtJs的TreePanel中的应用
代码如下:

var currentRootNode = null;//当前选择的根节点 
function NodeClass() 
{ //定义一个节点类 
var nodeValue = null; 
var nextNode = null;//下一个节点 
} 
function InitQueue(queue) 
{ //初始化一个队列 
queue = new NodeClass();//头节点为空 
return queue; 
} 
function Empty(queue) 
{ //判断一个队列为空 
var returnValue = false; 
if(queue.nextNode == null) 
{ 
returnValue = true; 
} 
return returnValue; 
} 
function EnQueue(queue,x) 
{ //入队操作 
var returnValue = queue; 
var currentNode = queue;//头节点 
while(currentNode.nextNode != null) 
{//current 一直到来到最后一个元素 
currentNode = currentNode.nextNode; // 
} 
var tempNode = new NodeClass(); //生成一个新的元素,并且值为X 
tempNode.nodeValue = x; 
currentNode.nextNode = tempNode; //插入到最后 
return returnValue; 
} 
function DeQueue(queue) 
{ //出队操作 
var returnValue = null; 
if(queue.nextNode != null) 
{ //如果队列非空 
if(queue.nextNode.nextNode == null) 
{ //如果是最后一个元素(即使队头又是队尾,只有一个元素) 
returnValue = queue.nextNode.nodeValue; //取得该元素的值 
queue.nextNode = null;//将头指针的queue的nextNode设置为NULL 
} 
else 
{ 
returnValue = queue.nextNode.nodeValue; //取得该元素的值 
queue.nextNode = queue.nextNode.nextNode; //将第二个元素的指针赋给queue的nextNode,相当于删除了第一个元素 
} 
} 
return returnValue; //返回被删除的第一个元素的值 
} 
function GetHead(queue) 
{ //获得队头元素的值 
return queue.nextNode.nodeValue; 
} 
function Clear(queue) 
{ //清空一个队列 
queue.nextNode = null; 
queue.nodeValue = null; 
} 
function Current_Size(queue) 
{ //获得当前队列的大小 
var returnValue = 0; 
var currentNode = queue.nextNode;//头结点 
while(currentNode != null) 
{ //从头往尾计算 
returnValue++; 
currentNode = currentNode.nextNode; //指向下一个元素 
} 
return returnValue; //返回大小 
} 
function findFirstCheafNode() 
{ 
var childNodes = null; 
var targetNode = null;//待查找的目标叶子节点 
var queue = null;//辅助队列 
queue = InitQueue(queue);//初始化队列 
queue = EnQueue(queue,currentRootNode);//根节点入队列 
while (!Empty(queue)) 
{//只要队列不空 
node = DeQueue(queue);//出队列 
if (node.hasChildNodes()) 
{//非叶子节点 
childNodes = node.childNodes; 
//其孩子节点从左到右依次入队列 
for (var i = 0,len = childNodes.length; i < len ; ++i) 
{ 
queue = EnQueue(queue,childNodes[i]); 
} 
} 
else 
{//找到第一个叶子节点 
return node; 
} 
} 
} 
Ext.onReady(function() 
{ 
var tree = new Ext.tree.TreePanel({ 
el: 'treeDiv', 
useArrows: true, 
autoScroll: true, 
animate: true, 
enableDD: true, 
containerScroll: true, 
border: false, 
// auto create TreeLoader 
loader: new Ext.tree.TreeLoader({dataUrl:'Level1.txt'}) 
}); 
var rootID = '0'; 
var rootnode = new Ext.tree.AsyncTreeNode({ 
id : rootID, 
text : '铁道部', 
draggable : false,// 根节点不容许拖动 
expanded : false 
}); 
// 为tree设置根节点 
tree.setRootNode(rootnode); 
tree.render(); 
tree.on('click',function(node,event) 
{//查询树的第一个叶子节点 
currentRootNode = node; 
var targetNode = findFirstCheafNode(); 
Ext.MessageBox.alert("info","当前根节点是: "+currentRootNode.text + " 它下面的第一个叶子节点是: " + targetNode.text); 
}); 
}); var childNodes = null; 
var targetNode = null;//待查找的目标叶子节点 
var queue = null;//辅助队列 
queue = InitQueue(queue);//初始化队列 
queue = EnQueue(queue,currentRootNode);//根节点入队列 
while (!Empty(queue)) 
{//只要队列不空 
node = DeQueue(queue);//出队列 
if (node.hasChildNodes()) 
{//非叶子节点 
childNodes = node.childNodes; 
//其孩子节点从左到右依次入队列 
for (var i = 0,len = childNodes.length; i < len ; ++i) 
{ 
queue = EnQueue(queue,childNodes[i]); 
} 
} 
else 
{//找到第一个叶子节点 
return node; 
} 
} 
} 
Ext.onReady(function() 
{ 
var tree = new Ext.tree.TreePanel({ 
el: 'treeDiv', 
useArrows: true, 
autoScroll: true, 
animate: true, 
enableDD: true, 
containerScroll: true, 
border: false, 
// auto create TreeLoader 
loader: new Ext.tree.TreeLoader({dataUrl:'Level1.txt'}) 
}); 
var rootID = '0'; 
var rootnode = new Ext.tree.AsyncTreeNode({ 
id : rootID, 
text : '铁道部', 
draggable : false,// 根节点不容许拖动 
expanded : false 
}); 
// 为tree设置根节点 
tree.setRootNode(rootnode); 
tree.render(); 
tree.on('click',function(node,event) 
{//查询树的第一个叶子节点 
currentRootNode = node; 
var targetNode = findFirstCheafNode(); 
alert("当前根节点是: "+currentRootNode.text + " 它下面的第一个叶子节点是: " + targetNode.text); 
}); 
});
Javascript 相关文章推荐
QUnit jQuery的TDD框架
Nov 04 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
Jan 04 Javascript
一个级联菜单代码学习及removeClass与addClass的应用
Jan 24 Javascript
微信分享的标题、缩略图、连接及描述设置方法
Oct 14 Javascript
jquery模拟实现鼠标指针停止运动事件
Jan 12 Javascript
JavaScript字符串常用的方法
Mar 10 Javascript
AngularJS入门教程之REST和定制服务详解
Aug 19 Javascript
jquery实现自定义图片裁剪功能【推荐】
Mar 08 Javascript
JavaScript JMap类定义与使用方法示例
Jan 22 Javascript
Vue CL3 配置路径别名详解
May 30 Javascript
Emberjs 通过 axios 下载文件的方法
Sep 03 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
Dec 04 Javascript
JavaScript 基于原型的对象(创建、调用)
Oct 16 #Javascript
JavaScript 定义function的三种方式小结
Oct 16 #Javascript
JavaScript 函数式编程的原理
Oct 16 #Javascript
实现JavaScript中继承的三种方式
Oct 16 #Javascript
显示js对象所有属性和方法的函数
Oct 16 #Javascript
半角全角相互转换的js函数
Oct 16 #Javascript
JavaScript 三种创建对象的方法
Oct 16 #Javascript
You might like
PHP魔术引号所带来的安全问题分析
2014/07/15 PHP
PHP list() 将数组中的值赋给变量的简单实例
2016/06/13 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
Laravel中的Blade模板引擎示例详解
2017/10/10 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
JS操作图片(增,删,改) 例子
2013/04/17 Javascript
jQuery简单实现仿京东分类导航层效果
2016/06/07 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
JS实现太极旋转思路分析
2016/12/09 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
2017/01/17 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
vue params、query传参使用详解
2017/09/12 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python多进程控制学习小结
2018/10/31 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
浅谈python中统计计数的几种方法和Counter详解
2019/11/07 Python
Python数据可视化:饼状图的实例讲解
2019/12/07 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
Python使用jpype模块调用jar包过程解析
2020/07/29 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
整理HTML5移动端开发的常用触摸事件
2016/04/15 HTML / CSS
一文彻底解决HTML5页面中长按保存图片功能
2019/06/10 HTML / CSS
荷兰牛仔裤网上商店:Jeans Centre
2018/04/03 全球购物
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
WebSphere面试题:在WebSphere里面如何部署一个应用
2015/08/02 面试题
学生手册评语
2014/05/05 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
五好文明家庭事迹材料
2014/12/20 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书
食品药品安全责任书
2015/05/11 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript