c语言 递归树形菜单,WPF树形菜单--递归与非递归遍历生成树结构的集合

一、新建了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&comma;javascript&comma;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 ...

二叉树前中后&sol;层次遍历的递归与非递归形式(c&plus;&plus;)

/* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...

数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)

前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...

java扫描文件夹下面的所有文件(递归与非递归实现)

java中扫描指定文件夹下面的所有文件扫描一个文件夹下面的所有文件,因为文件夹的层数没有限制可能多达几十层几百层,通常会采用两种方式来遍历指定文件夹下面的所有文件.递归方式非递归方式(采用队列或者栈实 ...

回溯算法 DFS深度优先搜索 (递归与非递归实现)

回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...

C语言实现 二分查找数组中的Key值&lpar;递归和非递归&rpar;

基本问题:使用二分查找的方式,对数组内的值进行匹配,如果成功,返回其下标,否则返回 -1.请使用递归和非递归两种方法说明. 非递归代码如下: #include int ...

随机推荐

xxx is not in the sudoers file&period;This incident will be reported&period;的解决方法 (一般用户不能执行sudo)

1.切换到root用户下 2.添加sudo文件的写权限,命令是:chmod u+w /etc/sudoers 3.编辑sudoers文件vi /etc/sudoers找到这行 root ALL=(AL ...

06Spring&lowbar;使用注解配置bean对象

Spring注解开发需要jar包 和 xml开发 一样的 ! 第一步: 新建项目, 导入jar包(就是前一篇文章里面的那几个核心jar包) 第二步: 在需要spring创建对象类上面 添加@Compo ...

Swift3&period;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 &num;75 1001 - King&&num;39&semi;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 ...

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值