用js实现树的先序遍历算法读取xml的每个结点

这里没有用递归算法,而是用JS实现一个堆栈,将数据放入一个堆栈来处理。

        var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = false;

        function genTableByXMLData() {
            var region = "CNDHN";
            var bDate = "20110101";
            var eDate = "20111231";

            xmlDoc.load("surmise.aspx?region=" + region + "&bDate=" + bDate + "&eDate=" + eDate);
            var x = xmlDoc.documentElement;

            var tree = new stack();

            tree.push(new Node(x, 0));

            var tmpNode = null;

            while (tree.top > 0) {


                if (tree.unit[tree.top - 1].value.hasChildNodes) {
                    if (tmpNode != null && tmpNode.index == tree.unit[tree.top-1].value.childNodes.length - 1) {
                        //已遍历孩子,结点弹出堆栈
                        tmpNode = tree.pop();
                        alert(tmpNode.value.tagName);
                    }
                    else if (tmpNode == null) {
                        //未有回溯行为
                        tree.push(new Node(tree.unit[tree.top-1].value.childNodes[0],0));
                        continue;
                    }
                    else if (tmpNode.index < tree.unit[tree.top-1].value.childNodes.length - 1) {
                        //未遍历孩子,将未遍历孩子压栈
                        tree.push(new Node(tree.unit[tree.top - 1].value.childNodes[tmpNode.index + 1], tmpNode.index + 1));
                        tmpNode = null;
                        continue;
                    }
                    
                }
                else {
                    //没有孩子,弹出堆栈
                    tmpNode = tree.pop();
                    alert(tmpNode.value.tagName);
                }
                
            }

//            var x = xmlDoc.documentElement.childNodes[0].childNodes[0].childNodes[0].childNodes[1];

//            alert(x.childNodes.length + "  " + x.childNodes[0].tagName);

        }

        function Node(x,i) {
            this.value = x;

            this.index = i;
        }

        function stack() {

            if (this.top == undefined) {
                //初始化堆栈的顶部指针和数据存放域
                this.top = 0;
                this.unit = new Array();
            }

            this.push = function (pushvalue) {
                //定义压入堆栈的方法            
                this.unit[this.top] = pushvalue;
                this.top += 1;
            }

            this.readAllElements = function () {
                //定义读取所有数据的方法
                if (this.top == 0) {
                    alert("当前栈空,无法读取数据");
                    return ("");
                }

                var count = 0;
                var outStr = "";

                for (count = 0; count < this.top; count++) {
                    outStr += this.unit[count] + ",";
                }
                return (outStr);
            }

            this.pop = function () {
                //定义弹出堆栈的方法
                if (this.top == 0) {
                    alert("当前栈空,无法弹出数据");
                    return ("");
                }

                var popTo = this.unit[this.top - 1];
                this.top--;
                return (popTo);

                /* 从堆栈弹出数据,顶部指针减一,不过这里没有做到资源的释放,也
                就是说数据仍然存在于this.unit的数组中,只不过无法访问罢了。目前
                我也没想到好的办法解决。*/
            }

        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值