面试汇总: 递归实现树形菜单结构的具体实现

最近在找工作,因为现在这家公司属实有点坑啊,我才来了几个月一半时间出差在外省,我好不容易从上海回来长沙,结果天天在比上海还要远的贵州深山里面过着与世隔绝的日子(俗称修仙了)

面试题很多,其他的我也不总结了,无非就是基础知识,论坛里面一搜索一大把,但是关于这个递归实现树形菜单结构,我当时居然脑袋懵逼了,没做出来,搞得我自己都怀疑人生了,太久没用了也没有去温习递归回来赶紧看下递归的逻辑写了如下demo:

主要思想就是,树形菜单时多级的,假设我们不知道会有多少层的时候,该怎么办,有父级菜单,也有子级菜单。子级菜单又会有子级菜单,那么对于子级的下一级菜单来说,这个子级就是下当前这个菜单的父级菜单了。所以我们的关键点就在于从第一级的父级菜单开始输出菜单,并且同时通过递归的形式不断地输出当前菜单的子级数据集。代码:

定义一个菜单类,作为单个菜单的对象

    /// <summary>
    /// 菜单基础数据类
    /// </summary>
    public class Menu
    {
        public int Code { get; set; }
        public string TreeName { get; set; }
        public int ParentId { get; set; }
    }

再定义一个要输出的树形结构菜单类,主要区别在于包含了子级菜单的属性:

 public class TreeMenu
    {
        public int Code { get; set; }
        public string TreeName { get; set; }
        public int ParentId { get; set; }

        public List<TreeMenu> Children { get; set; }
    }

定义基础数据:

 List<Menu> Tree = new List<Menu>();
            Menu node = new Menu();
            node.Code = 1;
            node.TreeName = "菜单A";
            node.ParentId = 0;
            Tree.Add(node);
            Menu node1 = new Menu();
            node1.Code = 2;
            node1.TreeName = "菜单B";
            node1.ParentId = 0;
            Tree.Add(node1);
            Menu node2 = new Menu();
            node2.Code = 3;
            node2.TreeName = "二级菜单";
            node2.ParentId = 1;
            Tree.Add(node2);
            Menu node3 = new Menu();
            node3.Code = 4;
            node3.TreeName = "菜单C";
            node3.ParentId = 0;
            Tree.Add(node3);

            Menu node4 = new Menu();
            node4.Code = 5;
            node4.TreeName = "二级菜单";
            node4.ParentId = 2;
            Tree.Add(node4);


            Menu node5 = new Menu();
            node5.Code = 6;
            node5.TreeName = "三级菜单";
            node5.ParentId = 3;
            Tree.Add(node5);

基本的数据结构和需要使用到的类都初始化好了,咱么来看具体的递归实现方法,可以实现理论无限级递归:

//list就是基础数据链表
//pid 要查找的当前菜单的ID或编码,也就是通过这个ID判断是否有比它更高一级的父级菜单
public static List<TreeMenu> getNode1(List<Menu> list, int pid)
        {
            List<TreeMenu> data = new List<TreeMenu>();
            var tree = list.Where(n => n.ParentId == pid);

            foreach (var item in tree)
            {
                Console.WriteLine(item.TreeName);
                TreeMenu menu = new TreeMenu()
                {
                    Children = getNode1(list, item.Code),
                    Code = item.Code,
                    ParentId = item.ParentId,
                    TreeName = item.TreeName
                };
                data.Add(menu);
            }
            return data;
        }

调用:

//0 标识从一级菜单开始递归,因为以及菜单的parentid都是等于0的。  
List<TreeMenu> data = getNode1(Tree,0);

结束。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值