用C#实现多叉树的生成并转化为extjs(基于js脚本的ajaxUI框架)的TreeNode的json数据

【菜科解读】
当时想这个算法的时候,是先想好了extjs的格式转换方法后才写的,写完后也没有考虑extjs是不是可以直接用{ id : , pid : , text : }格式的方式来表示呢?呵呵,如果是的话那就郁闷了~~,不管了。
为了使用Extjs实现在客户端显示树形节点,需要获得节点的孩子节点集合。
于是,花了三个小时时间写出了一个遍历算法(囧,代码编写能力还有待提高啊,有时候这中间的关系搞得我晕头转向的,不得不一边画图以便写代码~~),由children字段为空的List 分析并返回一个包含children的根节点树以便生成json数据。
算法思想如下:1)当nodelist中还有节点存在时,取出nodeList中的一个节点,并将其从nodeList中移除,进行2)2)采用深度遍历算法,每取一个节点,将其压入堆栈,因为nodelist中不包含根节点,故建立一个root节点,进行3)3)在循环中判断当前节点是否为空(即已加入为root节点的children集合),不为空则进行4),否则到exit)。
4)取出栈顶节点。
判断该节点是否有未加入children集合的孩子节点(即在nodeList中能否找到pid为节点id的节点),有则进行5),否则进行6)5)将该节点取出,并将其从nodeList中删除,入栈,继续查找,返回3)6)若当前节点没有孩子结点,到7)7)此时,判断堆栈是否为空,若为空(表示此时当前节点所有的子节点已找完),到8),若栈不为空,到9)8)当前节点为叶子节点,栈顶节点即为当前节点的父节点。
出栈,将子节点加入到父节点的children集合中。
父节点再入栈。
到3)9)判断当前节点是否还有父节点(即判断nodeList中是否还有id为当前节点pid的节点),若有,到10),否则到11)10)取出该节点为pNode,并将pNode从nodeList中删除,将当前节点cNode加入到pNode的children集合中,即作为父节点的孩子节点,父节点入栈(父节点还可能有别的孩子结点)。
到3)11)表示当前节点为顶级节点,将其直接加入到root的children中。
到3)因为每找到一个子节点均将齐从nodelist中移除,故当前节点的子节点最终都会找完exit)程序结束。
此时返回的root节点即为完整的多叉树的根节点,可通过其孩子集合来对节点进行访问,并通过json的方法进行树形数据格式的转换。
public class TreeNodeHelper /// /// 生成一个根节点的树 /// ///节点列表,包含未连接的树节点,节点中给出id,pid,text字段 /// public TreeNode GenerateTreeRoot(List nodeList) TreeNode root = new TreeNode(); TreeNode cNode; TreeNode chNode; TreeNode pNode; Stack stack = new Stack(); while(nodeList.Count>0) cNode = nodeList[0]; nodeList.Remove(cNode); stack.Push(cNode); while (cNode != null) cNode = stack.Pop(); if ((chNode = getChildren(cNode, nodeList)) != null) stack.Push(cNode); nodeList.Remove(chNode); stack.Push(chNode); else if (stack.Count > 0) pNode = stack.Pop(); pNode.Children.Add(cNode); stack.Push(pNode); else if((pNode=getParent(cNode,nodeList))!=null) nodeList.Remove(pNode); stack.Push(pNode); pNode.Children.Add(cNode); else root.Children.Add(cNode); cNode = null; return root; public TreeNode getChildren(TreeNode node, List list) return list.Find(delegate(TreeNode n) { return n.Pid == node.Id; }); public TreeNode getParent(TreeNode node, List list) return list.Find(delegate(TreeNode n) { return n.Id == node.Pid; });}
下面是节点类的定义:
public class TreeNode public TreeNode() m_Id = String.Empty; m_Pid = String.Empty; m_Text = String.Empty; m_Children = new List(); public TreeNode(string id, string pid, string text) m_Id = id; m_Pid = pid; m_Text = text; m_Children = new List(); private string m_Id; public string Id get { return m_Id; } set { m_Id = value; } private string m_Pid; public string Pid get { return m_Pid; } set { m_Pid = value; } private string m_Text; public string Text get { return m_Text; } set { m_Text = value; } private List m_Children; public List Children get { return m_Children; } set { m_Children = value; } public bool HasChildren get { if (this.Children != null) return m_Children.Count > 0 ? true : false; else return false; /// /// 生成根节点的json格式字符串 /// /// public string ToJsonTreeString() if (!this.HasChildren) return ""; StringBuilder sb = new StringBuilder(); sb.Append("["); foreach (TreeNode node in this.Children) sb.Append("{"); sb.Append("'id':'"); sb.Append(node.Id); sb.Append("','text':'"); sb.Append(node.Text); sb.Append("',"); //有孩子节点时添加children字段,否则令leaf字段为true if (node.HasChildren) sb.Append("'children':"); sb.Append(node.ToJsonTreeString()); else sb.Append("'leaf':true"); sb.Append("},"); //去掉最后一个逗号 if(this.Children.Count>0) sb.Remove(sb.ToString().LastIndexOf(','), 1); sb.Append("]"); return sb.ToString();} 代码写的比较菜,欢迎扔砖,共同进步 用,实现,多叉,树,的,生成,并转,化为,extjs,基于,人死后要用东西盖住脸?
历史记载最早的死后覆面的人就是春秋时期吴王夫差,他在被越往勾践灭国之后,死之前对手下的人说,我死了之后,请用白布盖住我的脸,因为我实在是死后到了阴曹地府不敢面对伍子胥,大明崇祯皇帝在死前也写下:朕死,无面目见祖宗于地下,自去冠冕,以发覆面。
任贼分裂朕尸,勿伤百姓一人。
” 可见死后用东西盖住脸是自古就有的,那么这么做只是一种习俗吗?还是有着科学的依据呢? 答案是肯定的,中国人是世界上最优秀的名族之一,中国的古人也是非常的有智慧的,他们为世界文明的发展作出了杰出的贡献,人死之后用东西盖住脸,也无不体现出中国古人的智慧,下面我们就看看死后用东西覆面的科学之处。
1、从现代医学的角度来看,人死之后,人体寄生的病菌失去了寄主,会离开死去的宿主,盖住脸,能防止肠胃中的病菌飞出。
2、人死之后,用纸盖住脸,因为纸较轻,如果人还没有死,菜科网,只是暂时的没有呼吸,那么呼吸的气体会引发纸的晃动,避免人没死就被埋了的结果。
3、中国人有停尸三天的习惯,人死之后脸色肯定不太好看,这样能避免引起前来吊丧人的恐惧。
4、遮住尘土,为了防止尘土落到死者的脸上,给死者一片干净,也是对死者的一种尊重。
南宁领取社保福利补贴,有哪些实用的操作方法?(4月20日)
一是城镇职工社保。
分为养老保险、医疗保险、计划生育险、失业保险、工伤保险,简称为“五险”。
二是城乡居民社保。
城乡居民社保分为城乡居民养老保险、城乡居民医疗保险两大部分。
主要参保人员为没有参加城镇职工社保的城乡居民。
城乡居民社保是由原来的新型农村社保和城镇居民社保合并而来的。
领取社保福利补贴的条件、步骤是怎样的?本文带你一探究竟。
南宁领取社保福利补贴,有哪些实用的操作方法?怎样做才能成功领取社保福利补贴?快了解。
一般而言,社保福利补贴的领取方式主要包含以下几种。
以下将详细说明领取社保福利补贴的具体步骤和所需材料:灵活就业社保补贴:申请条件:适用于就业困难人员(如女性满40周岁、男性满50周岁等特殊群体)、离校2年内未就业的高校毕业生、以及个体工商户等。
所需材料:身份证、户口簿、就业失业登记证、灵活就业承诺书、社保缴费凭证等。
申请流程:线上可通过当地人社局官网或相关APP申请,填写信息并上传相关材料;线下需前往户籍所在地或常住地街道(乡镇)社保服务中心提交纸质材料。
毕业生就业补贴:适用对象:毕业两年内的高校毕业生,需在中小微企业就业并签订一年以上劳动合同。
补贴标准:各地金额不同,如深圳为一次性3000元,广州为3000元。
申请流程:符合条件的参保人可在满足社保缴纳要求后一次性申领。
失业保险相关补贴:失业保险金:适用于非自愿失业且累计缴纳失业保险满1年者,补贴标准每月约2000元,最长领取24个月。
失业补助金:适用于主动辞职或不符合失业保险金条件者,补贴标准每月300-1000元,最长领取6个月。
生育津贴:适用对象:单位缴纳生育保险满1年的女性职工与配偶参保的失业女性,皆属于适用对象范畴。
补贴标准:根据地区平均工资计算,通常为几万元,可一次性或按月领取。
公积金和养老金:公积金:可用于申请公积金贷款或直接提取,申领条件为正常缴存公积金且无房。
养老金:只要社保累计缴纳满足15年,并且达到法定退休年龄,即可领取养老金,而领取的金额与缴纳金额、年限有关系。
?申请这些补贴时需要注意的事项包括?:如不慎遭遇网络诈骗,保存好相关证据材料并立即报警。
线上预审时,务必在官网进行操作,避免在私人链接提交信息,以防信息泄露。
不同地区的补贴金额和领取期限有所不同,具体需向当地社会保险经办部门咨询或拨打12333热线确认。