遍历、查找

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;
        }
时间: 2024-07-30 01:46:05

遍历、查找的相关文章

遍历查找问题的应用场景

查找问题是指在一个样本范围内,是否存在需要的数据. 在学习开发的过程中,我们经常遇到该类型的问题,学习遍历-查找问题,将有助于我们快速分析问题,给出解题思维流程图. 1.查找判断问题 单纯的查找问题,是用来判断给出的数据类型里面是否存在有我们想查找的数据,而不关心这些数据是什么.在解决该类问题的时候,往往用到以下方案: 第一步:定义一个bool变量isFind,表示是否找到,由于一开始还没有开始查找,自然没有找到,所以变量isFind的值应该为false. bool isFind=false;

爪哇国新游记之二十五----图及其遍历查找

代码: import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; // 顶点类 class Vertex{ String name;// 名称 boolean visited;// 是否已访问

DOM遍历查找结点

一.遍历API(2个) 1.深度优先原则遍历NodeIterator 节点迭代器 创建遍历API对象: var iterator=document.createNodeIterator(开始的父节点对象,whatToShow,null,false); whatToShow: NodeFilter.SHOW_ELEMENT(遍历元素节点) NodeFilter.SHOW_ALL(遍历所有) 用while循环,反复调用iterator.nextNode()方法 只要nextNode(),就向下一个移

2015 ACM/ICPC Asia Regional Changchun Online HDU 5444 Elven Postman【二叉排序树的建树和遍历查找】

Elven Postman Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 591    Accepted Submission(s): 329 Problem Description Elves are very peculiar creatures. As we all know, they can live for a very

二叉树的前序遍历建立与二叉树的前序遍历查找

#include<iostream> #include<vector> using namespace std; //二叉树的定义 struct TreeNode { char val; TreeNode *left; TreeNode *right; TreeNode(int x='#') : val(x), left(NULL), right(NULL) {} }; //建立二叉树 //AB#D##C##前序遍历 void erchashu_jianli(TreeNode**

File遍历查找

获取当前目录下的文件和子文件夹 System.out.println("-------------list()方法--------------"); File dir2=new File("d:\\"); String[] list = dir2.list(); for (String string : list) { System.out.println(string); } 获取当前目录下的pdf文件 String[] list=dir.list(new Fil

Openlayers 遍历查找交互事件(ol.interaction)

说明 有时候需要遍历openlayers的交互事件,并根据不同类型进行操作/监控. 解决方案 方法一:实现了找到交互事件中的Select事件,并删除 map.getInteractions().forEach(function (interaction) { if (interaction instanceof ol.interaction.Select) { map.removeInteraction(interaction); } }); 方法二:其实还有另一种写法,getArray()获取

两个集合遍历查找不重复

int[] tab1 = new int[]{2009,2010,2013};int[] tab2 = new int[]{2009,2010,2009,2010,2014}; //这里首先遍历表2for(int i=0; i<tab2.length; ++i) {//取出表2中的数据int elem2 = tab2[i]; boolean find = false; //这里遍历表1for(int j=0;j<tab1.length; ++j) { //取出表1中的数据int elem1 =

遍历查找跳格子逻辑

package solution; import java.util.Scanner; import java.util.Stack; public class Jump { static boolean found=false; static int count=0; public static void main(String[] args) { Scanner sc=new Scanner(System.in); int N=sc.nextInt(); for(int cases=1;ca

查找MDB中高程点的高程值有0值的图幅(用游标遍历查找某个字段的值),并将查到的结果写入到TXT中

1. mdbs = arcpy.ListWorkspaces("*","Access") 2. FeatureClasses = arcpy.ListFeatureClasses() 3. Fields = arcpy.ListFields(FeatureClass) 4. cursor = arcpy.da.SearchCursor(FeatureClass, 'ELEV') 注意:工作空间的转换 import arcpy from arcpy import en