zoukankan      html  css  js  c++  java
  • 遍历、查找

    1、递归添加树节点

    先找出所有根节点,添加到树,然后根据根节点的id遍历找出所有对应子节点添加到其子节点处。

    递归要有跳出条件,方法要自己调用自己。

            List<ClassDG> list = new List<ClassDG>()
            {
                new ClassDG() {ID="0",PID="",name="0" },
                new ClassDG() {ID="1",PID="",name="1" },
                new ClassDG() {ID="2",PID="1",name="2" },
                new ClassDG() {ID="3",PID="1",name="3" },
                new ClassDG() {ID="4",PID="2",name="4" },
                new ClassDG() {ID="5",PID="4",name="5" }
            };
    
            private void button1_Click(object sender, EventArgs e)
            {
                foreach (ClassDG item in list)
                {
                    if (string.IsNullOrEmpty(item.PID))
                    {
                        this.treeView1.Nodes.Add(item.ID, item.name);
                    }
                }
    
                for (int i = 0; i < this.treeView1.Nodes.Count; i++)
                {
                    AddNodes(treeView1.Nodes[i], treeView1.Nodes[i].Name);
                }
            }
    
            void AddNodes(TreeNode treenode,string id)
            {
                List<ClassDG> lst = list.Where(p => p.PID.Equals(id)).ToList();
                if (treenode == null || lst.Count == 0)
                    return;
                foreach (ClassDG item in lst)
                {
                    if (treenode.Name.Equals(item.PID))
                    {
                        treenode.Nodes.Add(item.ID, item.name);
                    }
                    for (int i = 0; i < treenode.Nodes.Count; i++)
                    {
                        AddNodes(treenode.Nodes[i], item.ID);
                    }
                }
            }

    2、树的广度优先遍历

    先遍历最外围的,如果有子集下次遍历。

            /// <summary>
            /// 树的广度优先遍历
            /// </summary>
            /// <param name="treenodes"></param>
            void PrintNodeWidthFirst(IEnumerable<TreeNode> treenodes)
            {
                //要遍历的下级节点
                List<TreeNode> listNodes = new List<TreeNode>();
                foreach (TreeNode childNode in treenodes)
                {
                    //如果节点有子节点则将子节点加入listNodes以备稍后遍历
                    if(childNode.Nodes.Count>0)
                    {
                        listNodes.AddRange(childNode.Nodes.OfType<TreeNode>());
                    }
                    
                }
                //如果有待遍历的子节点
                if(listNodes.Count>0)
                {
                    PrintNodeWidthFirst(listNodes);
                }
            }

    3、二分叉查找(针对有序列表)

    取中间位索引,如果这个数等于要查找的数则返回,如果不是这个数比要找的数大的话则索引减1,反之在另一边低位为中间位索引加1。循环完毕都没有则没有这个数。

    Array有自己内置的二叉查找方法,比用户定制的方法执行速度快10倍。

            int binary_search(List<int> list,int goal)
            {
                int low = 0;
                int high = list.Count - 1;
                while (low <= high)
                {
                    //middle = (high - low) / 2 会死循环 所以 如果用减 middle =(high - low) / 2 + low;
                    //high:7 low:3 high-low:4 middle=4/2=2 if list[middle]<goal low=middle+1=3 又等于3了 进入前面死循环 middle又等于2 
                    //middle = (high + low) / 2 没发现什么问题。
                    int middle = (high + low) / 2;
                    if (list[middle] == goal)
                        return middle;
                    //在左半边
                    else if (list[middle] > goal)
                    {
                        high = middle - 1;
                    }
                        
                    //在右半边
                    else
                        low = middle + 1;
                }
                //没找到
                return -1;
            }
  • 相关阅读:
    spring mvc文件上传,request对象转换异常
    解决国内android sdk无法更新,google不能的简单办法
    1.5 高速找出机器故障
    图的深度优先搜索与广度优先搜索
    我对ThreadLocal的理解
    Leetcode--3Sum
    &lt;转&gt;Openstack Ceilometer监控项扩展
    怎样利用WordPress创建自己定义注冊表单插件
    java_免费视频课程汇总
    HDU 3641 Pseudoprime numbers(快速幂)
  • 原文地址:https://www.cnblogs.com/buzhidaojiaoshenme/p/6835372.html
Copyright © 2011-2022 走看看