IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    DataStructure.js

    潘魏增发表于 2008-04-06 14:59:00
    love 0

    去年照着严蔚敏的《数据结构》写了这个脚本,用JavaScript实现了栈、队列、链表、树和二叉树。后来在工作中没发现能派上什么用场,丢在一边很久也没理会。今天偶然翻了一下觉得有些写得还挺有意思的。

    例如求树的所有叶子节点数。

    递归解法:
    getLeafCount:function(){
        var _count = 0;
        for(var i in this.children){
            if(this.children[i].hasChild()) 
                _count += this.children[i].getLeafCount();
            else 
                _count++;
        }
        return _count;
    }
    使用堆栈的非递归解法:
    getLeafCount:function()
    {
        var _stack = new BX.DataStructure.Stack();
        var _tree = this;
        var _count = 0;
        while(_tree != null)
        {
            for(var i = 0; i < _tree.children.length; i++)
                {
                    if(_tree.children[i].hasChild()) 
                        _stack.push(_tree.children[i]);
                    else 
                        _count++;
                }
            _tree = _stack.pop();
        }
        return _count;
    }
    使用队列的非递归解法:
    getLeafCount:function()
    {
        var _queue = new BX.DataStructure.Queue();
        var _tree = this;
        var _count = 0;
        while(_tree != null)
        {
            for(var i = 0; i < _tree.children.length; i++)
            {
                if(_tree.children[i].hasChild()) 
                    _queue.enQueue(_tree.children[i]);
                else 
                    _count++;
            }
            _tree = _queue.deQueue();
        }
        return _count;
    }

    又如求二叉树同一深度的所有子节点。

    广度优先(Queue实现)
    getChildrenByDepth:function(depth)
    {
        if(depth < 1) return null;
        if(depth == 1) return new Array(this);
        var _queue = new BX.DataStructure.Queue();
        //同一层元素的个数队列,对头为同一层元素的个数
        var _depthQueue = new BX.DataStructure.Queue();
        var _children = [];
        var _treeNode = null;
        var _depth = 1;
        var _count = 0;
        _queue.enQueue(this);
        while(!_queue.isEmpty())
        {
            if(_depth == depth) { _children = _queue.elements; break;}
            else
            {
                _depthQueue.enQueue(_queue.getLength());
                _treeNode = _queue.deQueue();
                if(_treeNode.hasLeftChild()) _queue.enQueue(_treeNode.leftChild);
                if(_treeNode.hasRightChild()) _queue.enQueue(_treeNode.rightChild);
                _count++;
                //当计数等于同一层元素个数的时候,_depthQueue置0,下一次循环时推入下一层的个数
                if(_count == _depthQueue.getHead())
                {
                    _depth++;
                    _count = 0;
                    _depthQueue.clear();
                }
            }
        }
        return _children;
    }
    
    深度优先(Stack实现)
    getChildrenByDepth:function(depth)
    {
        if(depth < 1) return null;
        if(depth == 1) return new Array(this);
        var _stack = new BX.DataStructure.Stack();
        var _depthStack = new BX.DataStructure.Stack();
        var _children = [];
        var _treeNode = null;
        var _currentDepth = 1;
        var isMatched = false;
        _stack.push(this);
        _depthStack.push(_currentDepth);
        while(!_stack.isEmpty())
        {
            //元素和该元素相应的深度同时出栈
            _treeNode = _stack.pop();
            _currentDepth = _depthStack.pop();
    
            if(_treeNode.hasLeftChild() || _treeNode.hasRightChild()) 
                _currentDepth++;
            //判断是否到达所求深度,如果是则添加到_children数组,否则当前深度和子元素都入栈
            isMatched = _currentDepth == depth ? true : false;
            if(_treeNode.hasLeftChild())
            {
                if(isMatched) _children.push(_treeNode.leftChild);
                else
                {
                    _stack.push(_treeNode.leftChild);
                    _depthStack.push(_currentDepth);
                }
            }
            if(_treeNode.hasRightChild())
            {
                if(isMatched) _children.push(_treeNode.rightChild);
                else
                {
                    _stack.push(_treeNode.rightChild);
                    _depthStack.push(_currentDepth);
                }
            }
        }
        return _children;
    }


沪ICP备19023445号-2号
友情链接