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

今天帮朋友解决了一个问题:使用ExtJsTreePanel控件,如何得到树的第一个叶子节点的信息。

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

效果如下图:

代码如下:

  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);
        });
    });

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值