层序遍历在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 相关文章推荐
自己的js工具 Event封装
Aug 21 Javascript
document.write的几点使用心得
May 14 Javascript
如何用JavaScript定义一个类
Sep 12 Javascript
jquery实现Ctrl+Enter提交表单的方法
Jul 21 Javascript
Javascript基础_嵌入图像的简单实现
Jun 14 Javascript
AngularJS基础 ng-dblclick 指令用法
Aug 01 Javascript
AngularJS中transclude用法详解
Nov 03 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
Aug 08 jQuery
完美解决手机网页中输入框被输入法遮挡的问题
Dec 19 Javascript
p5.js实现斐波那契螺旋的示例代码
Mar 22 Javascript
uni-app如何实现增量更新功能
Jan 03 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
May 31 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编写PDF文档生成器
2006/10/09 PHP
php ajax 静态分页过程形式
2011/09/02 PHP
smarty模板判断数组为空的方法
2015/06/10 PHP
yii2简单使用less代替css示例
2017/03/10 PHP
Thinkphp整合阿里云OSS图片上传实例代码
2019/04/28 PHP
jquery mobile的触控点击事件会多次触发问题的解决方法
2014/05/08 Javascript
JS设置cookie、读取cookie、删除cookie
2015/04/17 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
js通过指定下标或指定元素进行删除数组的实例
2017/01/12 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
angularJS的radio实现单项二选一的使用方法
2018/02/28 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
python生成器的使用方法
2013/11/21 Python
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
Python 详解基本语法_函数_返回值
2017/01/22 Python
python实现log日志的示例代码
2018/04/28 Python
Flask模板引擎之Jinja2语法介绍
2019/06/26 Python
Python中的全局变量如何理解
2020/06/04 Python
python编写实现抽奖器
2020/09/10 Python
你不知道的5个HTML5新功能
2016/06/28 HTML / CSS
Revolution Beauty美国官网:英国知名化妆品网站
2018/07/23 全球购物
.NET初级开发工程师面试题
2014/04/18 面试题
社会实践评语
2014/04/28 职场文书
我的理想演讲稿
2014/04/30 职场文书
2014最新房贷收入证明范本
2014/09/12 职场文书
车间主任岗位职责
2015/02/03 职场文书
学期个人工作总结
2015/02/13 职场文书
校友回访母校寄语
2015/02/26 职场文书
新学期家长寄语2016
2015/12/03 职场文书