层序遍历在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 相关文章推荐
javascript 动态调整图片尺寸实现代码
Dec 28 Javascript
服务器端的JavaScript脚本 Node.js 使用入门
Mar 07 Javascript
Array 重排序方法和操作方法的简单实例
Jan 24 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
Aug 21 Javascript
JavaScript正则表达式匹配 div  style标签
Mar 15 Javascript
深入浅析JS的数组遍历方法(推荐)
Jun 15 Javascript
ajax的分页查询示例(不刷新页面)
Jan 11 Javascript
基于bootstrap写的一点localStorage本地储存
Nov 21 Javascript
JavaScript常见继承模式实例小结
Jan 11 Javascript
Vue.js组件使用props传递数据的方法
Oct 19 Javascript
vuex 实现getter值赋值给vue组件里的data示例
Nov 05 Javascript
简单了解Vue computed属性及watch区别
Jul 10 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图片验证码代码
2008/03/27 PHP
php动态生成JavaScript代码
2009/03/09 PHP
php 数学运算验证码实现代码
2009/10/11 PHP
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
一致性哈希算法以及其PHP实现详细解析
2013/08/24 PHP
PHP字符串的连接的简单实例
2013/12/30 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
2015/11/10 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
2018/12/21 PHP
javascript 短路法代码精简
2009/08/20 Javascript
jquery 表单取值常用代码
2009/12/22 Javascript
javascript smipleChart 简单图标类
2011/01/12 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
jquery cookie的用法总结
2013/11/18 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
js模拟微博发布消息
2017/02/23 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
基于Vue SEO的四种方案(小结)
2019/07/01 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
2020/02/04 jQuery
原生JS实现汇率转换功能代码实例
2020/05/13 Javascript
Python实现批量修改文件名实例
2015/07/08 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
Coltorti Boutique官网:来自意大利的设计师品牌买手店
2018/11/09 全球购物
银行见习期自我鉴定
2014/01/29 职场文书
志愿者服务感言
2014/02/27 职场文书
调查研究项目计划书
2014/04/29 职场文书
2014年安全生产大检查方案
2014/05/13 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
服务整改报告
2014/11/06 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
MySQL七大JOIN的具体使用
2022/02/28 MySQL