一、新建了WPF项目作为测试,使用TreeView控件进行界面展示。
第一步创建实体类TreeEntity:
public class TreeEntity
{
private int _mid;
private string _title;
private int _pid;
private List _childrens=new List();
///
/// 项ID
///
public int Mid
{
get { return _mid; }
set
{
_mid = value;
}
}
///
/// 项名称
///
public string Title
{
get { return _title; }
set
{
_title = value;
}
}
///
/// 父亲ID
///
public int Pid
{
get { return _pid; }
set
{
_pid = value;
}
}
///
/// 儿子们
///
public List Childrens
{
get { return _childrens; }
set
{
_childrens = value;
}
}
}
第二部构造无层级的数据源:
TreeEntity yeye = new TreeEntity()
{
Mid = ,
Title = "猪爷爷",
Pid =
};
TreeEntity laolao = new TreeEntity()
{
Mid = ,
Title = "猪姥姥",
Pid =
};
TreeEntity baba = new TreeEntity()
{
Mid = ,
Title = "猪爸爸",
Pid =
};
TreeEntity mama = new TreeEntity()
{
Mid = ,
Title = "猪妈妈",
Pid =
};
TreeEntity peiqi = new TreeEntity()
{
Mid = ,
Title = "佩奇",
Pid =
};
TreeEntity peizierzi = new TreeEntity()
{
Mid = ,
Title = "小佩佩奇",
Pid =
};
TreeEntity peiqisunzi = new TreeEntity()
{
Mid = ,
Title = "佩奇的孙子",
Pid =
};
TreeEntity peiqinver = new TreeEntity()
{
Mid = ,
Title = "小佩佩妞",
Pid =
};
TreeEntity qiaozhi = new TreeEntity()
{
Mid = ,
Title = "乔治",
Pid =
};
List treeEntities = new List()
{
yeye,
laolao,
mama,
peiqi,
peiqinver,
peiqisunzi,
qiaozhi,
peizierzi
};
第三步实现树形集合的构造
方法一:使用递归方法构造
1)、先取出顶级数据项--即无父亲的项
List rootLists = treeEntities.Where(x => x.Pid == ).ToList();
for (int i = ; i < rootLists.Count; i++)
{
rootLists[i].Childrens = CreateTree(rootLists[i].Mid, treeEntities);
}
2)、再遍历上一步取得的数据项,使用递归获取所有子项
private List CreateTree(int pid, List sources)
{
List childrens = new List();
if (sources != null && sources.Count > )
{
childrens = sources.Where(x => x.Pid == pid).ToList();
if (childrens != null & childrens.Count > )
{
foreach (var item in childrens)
{
item.Childrens = CreateTree(item.Mid, sources);
}
}
}
return childrens;
}
3)、将集合绑定给TreeView的数据源
MyTreeList.ItemsSource = rootLists;
方法二:非递归遍历
1)、将所有数据项装进字典中 字典中的键为 当前实例的ID;字典中的项为当前实例
Dictionary valuePairs = new Dictionary();
foreach (var item in treeEntities)
{
valuePairs[item.Mid] = item;
}
List rootLists =CreateTreeQuick(valuePairs);
2)、遍历字典中的所有Values,向当前项(item)的PID对应的实例中添加当前项(item)
private List CreateTreeQuick(Dictionary keyValues)
{
List myTree = new List();
foreach (var item in keyValues.Values)
{
if (item.Pid==)
{
myTree.Add(item);
}
else
{
if (keyValues.ContainsKey(item.Pid))
{
keyValues[item.Pid].Childrens.Add(item);
}
}
}
return myTree;
}
3)、将集合绑定到TreeView控件的数据源中
MyTreeList.ItemsSource = rootLists;
二、WPF前台布局
数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java
前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...
C实现二叉树(模块化集成,遍历的递归与非递归实现)
C实现二叉树模块化集成 实验源码介绍(源代码的总体介绍):header.h : 头文件链栈,循环队列,二叉树的结构声明和相关函数的声明.LinkStack.c : 链栈的相关操作函数定义.Queue. ...
二叉树3种递归和非递归遍历(Java)
import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...
JAVA递归、非递归遍历二叉树(转)
原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...
二叉树前中后/层次遍历的递归与非递归形式(c++)
/* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...
数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)
前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...
java扫描文件夹下面的所有文件(递归与非递归实现)
java中扫描指定文件夹下面的所有文件扫描一个文件夹下面的所有文件,因为文件夹的层数没有限制可能多达几十层几百层,通常会采用两种方式来遍历指定文件夹下面的所有文件.递归方式非递归方式(采用队列或者栈实 ...
回溯算法 DFS深度优先搜索 (递归与非递归实现)
回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...
C语言实现 二分查找数组中的Key值(递归和非递归)
基本问题:使用二分查找的方式,对数组内的值进行匹配,如果成功,返回其下标,否则返回 -1.请使用递归和非递归两种方法说明. 非递归代码如下: #include int ...
随机推荐
xxx is not in the sudoers file.This incident will be reported.的解决方法 (一般用户不能执行sudo)
1.切换到root用户下 2.添加sudo文件的写权限,命令是:chmod u+w /etc/sudoers 3.编辑sudoers文件vi /etc/sudoers找到这行 root ALL=(AL ...
06Spring_使用注解配置bean对象
Spring注解开发需要jar包 和 xml开发 一样的 ! 第一步: 新建项目, 导入jar包(就是前一篇文章里面的那几个核心jar包) 第二步: 在需要spring创建对象类上面 添加@Compo ...
Swift3.0 iOS获取当前时间 - 年月日时分秒星期
Swift3.0 iOS获取当前时间 - 年月日时分秒星期func getTimes() -> [Int] { var timers: [Int] = [] // 返回的数组 let calen ...
Introduction to Face Detection and Face Recognition
http://www.shervinemami.info/faceRecognition.html http://docs.opencv.org/2.4/modules/contrib/doc/fac ...
KextWizard 的使用方法;以及Kext安装的几种工具下载
a.将你需要安装的Kext拖到非中文的路径中: b.运行该软件,将Kext拖入下图对应的方框里,然后选择位置安装: c.选择修复权限和重建缓存(一个是修复Extra文件夹,一个是修复SLE) Kext ...
禁用cookie后
服务器为某个访问者创建一个内存区域,这个就是所谓的session,这个区域的存在是有时间限制的,比如30分钟,这块区域诞生的时候,服务器会给这个区域分配一个钥匙,只有使用这个钥匙才能访问这个区域,这个 ...
Android studio中出现非法字符时的部分解决方法
我将原来在Eclipse中开发的工程搬到了Android studio上来,在运行,编译程序的过程中出现了错误.提示存在非法字符. 后来发现是由于程序代码中有中文字符的出现,问题就出在对中文支持的UT ...
Hdu 5444 Elven Postman dfs
Elven Postman Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
BestCoder Round #75 1001 - King&#39;s Cake
Problem Description It is the king's birthday before the military parade . The ministers prepared a ...
input 在 2 和 3 上的区别
2 和 3 上面 在 input 的区别 1 2 3 name = raw_input('请输入用户名:')#python2.7的用法 name = input('请输入用户名:')#python3 ...