层序遍历在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 相关文章推荐
让回调函数 showResponse 也带上参数的代码
Aug 13 Javascript
jquery图片放大镜功能的实例代码
Mar 26 Javascript
防止浏览器记住用户名及密码的简单实用方法
Apr 22 Javascript
jquery退出each循环的写法
Feb 26 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
Mar 18 Javascript
javascript实现俄罗斯方块游戏的思路和方法
Apr 27 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
Aug 12 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
Jun 06 Javascript
Vue中保存数据到磁盘文件的方法
Sep 06 Javascript
JS实现深度优先搜索求解两点间最短路径
Jan 17 Javascript
微信小程序实现跳转的几种方式总结(推荐)
Apr 24 Javascript
在layui中select更改后生效的方法
Sep 05 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 session应用实例 登录验证
2009/03/16 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
移动端日期插件Mobiscroll.js使用详解
2016/12/19 Javascript
jQuery基于正则表达式的表单验证功能示例
2017/01/21 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
将Python中的数据存储到系统本地的简单方法
2015/04/11 Python
13个最常用的Python深度学习库介绍
2017/10/28 Python
python批量修改文件编码格式的方法
2018/05/31 Python
python 提取tuple类型值中json格式的key值方法
2018/12/31 Python
python3.x实现base64加密和解密
2019/03/28 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
3种python调用其他脚本的方法
2020/01/06 Python
解决springboot yml配置 logging.level 报错问题
2020/02/21 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
2020/03/11 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
详解python的super()的作用和原理
2020/10/29 Python
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
办公室副主任岗位职责
2013/11/25 职场文书
医学生自荐信
2013/12/03 职场文书
满月酒答谢词
2014/01/14 职场文书
银行见习期自我鉴定
2014/01/29 职场文书
物业保安员岗位职责制度
2014/01/30 职场文书
房屋租赁协议书范本
2014/04/10 职场文书
材料专业大学毕业生自荐书
2014/07/02 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书