日期:2014-05-17  浏览次数:20786 次

发个非递归遍历树的方法,代码很简单,回者有分。
实话说,不是我对递归有偏见,实在是递归太难调试,
自己调用自己几次后,我就感觉头晕了,就不知道是第几层了,
所以改成用循环来实现,代码比较容易理解,也容易调试:


        public static ArrayList CheckedCodes(TreeView pTree) {
            ArrayList rList = new ArrayList();
            TreeNodeCollection oNodes = pTree.Nodes;
            short level = 0;
            IList<IEnumerator> oNodeList = new List<IEnumerator>();
            oNodeList.Add(oNodes.GetEnumerator()); 
            while (level >= 0) {
                IEnumerator enumer = oNodeList[level];
                if (enumer.MoveNext()) {
                    TreeNode oNode = (TreeNode)enumer.Current;
                    rList.Add(new string(' ', level * 2) + oNode.Tag);
                    if (oNode.Nodes.Count > 0) {
                        level++;
                        oNodeList.Add(oNode.Nodes.GetEnumerator());
                    }
                }
                else {
                    oNodeList.RemoveAt(level);
                    level--;
                }
            }
            return rList;
        }

------解决方案--------------------
递归是最好写的,基本上编写都是一次性通过(基本上不用调试、出问题了,看看代码基本上就可以定位错误,因为代码比较好理解),反而非递归的可读性更差。


------解决方案--------------------