为什么这个代码就实现类似递归

类似于下面这个代码,为什么最后root有排序好的树菜单,效果类似于递归,但是为什么给okNodes赋的值为什么跑到root里面是因为内存地址一样吗
不懂其中原理啊


using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;

namespace ConsTest
{
    class Program
    {
        static void Main(string[] args)
        {
 
            var datalist = Gtuslk();
            var root = datalist.Where(r => r.ParId == 0).ToList();
            var okNodes = new List<Useril>();
            foreach (var item in root)
            {
                okNodes.Add(item);
            }

            var list = datalist.Where(r => r.ParId != 0).ToList();

            foreach (var item in list)
            {
                foreach (var it in okNodes)
                {
                    if (it.Id == item.ParId)
                    {
                        var e = new Useril { Id = item.Id, name = item.name, sex = item.sex };
                        var node = okNodes.First(r => r.Id == it.Id);
                        if (node.us == null)
                            node.us = new List<Useril>();
                        node.us.Add(e);
                        okNodes.Add(e);
                        break;
                    }
                }

            }
            WriteRoot(root,"没有父级");

            Console.ReadKey();
        }

        private static List<Useril> Gtuslk()
        {
            var us = new List<Useril>() {
                new Useril{
                    Id = 1,
                    ParId=0,
                name = "张三",
                sex = "男"
                },
                new Useril{
                    Id = 2,
                    ParId=0,
                name = "李四",
                sex = "男"
                }, new Useril{
                    Id = 3,
                    ParId=1,
                name = "赵五",
                sex = "男"
                }, new Useril{
                    Id = 3,
                    ParId=1,
                name = "六子",
                sex = "男"
                }, new Useril{
                    Id = 4,
                    ParId=2,
                name = "格式",
                sex = "男"
                }, new Useril{
                    Id = 5,
                    ParId=3,
                name = "好的",
                sex = "男"
                }, new Useril{
                    Id = 6,
                    ParId=5,
                name = "函数",
                sex = "男"
                }
            };
            return us;
        }

        private static void WriteRoot(List<Useril> root, string parnm)
        {
            foreach (var item in root)
            {
                Console.WriteLine(parnm + "< 是" + item.name + "父级," + item.sex);
                if (item.us.Count>0)
                    WriteRoot(item.us, item.name);
            }
        }
    }


    public class Useril
    {
        public int Id { set; get; }
        public int ParId { set; get; }
        public string name { set; get; }
        public string sex { set; get; }

        public List<Useril> us { set; get; }

        public Useril()
        {
            us = new List<Useril>();
        }
    }
}

用双重循环实现

var list=dataList.Where(r => r.PARID!=1).ToList();
我觉得是这句代码的问题,他获取除了第一层以外的所有子集了。
root已经获取到第一层了,那么,这里应该要写成 r => r.PARID == 2 这样才对吧。。。

我猜测是这样,具体这点信息很难分辨.

GetOrtherAll 方法是什么内容。

只有按 邻接列表算法组织的数据才需要递归
而现在大部分的树都不需要递归了

再说,尾递归必然可以化为循环
所以 GetOrtheTree 方法被设计成非递归是很正常的