如何从树叶层开始建树三?
如何从树叶层开始建树,如何从树叶层开始建树?中的方法虽好,可对树的要求太严格,如何从树叶层开始建树二?中的方法虽然使用各种情况,但毕竟递归了很多次,性能会差很多。
例如如下一棵树,要把叶节点是偶数的节点组成一棵树
也就是得到如下一棵树:便是一种典型应用。
于是自己也在思索能不能把如何从树叶层开始建树?中的方法进行扩展,使她可以使用所有情况,最总实现了,但必须知道每一个节点所在的层次。
例如如上的树:规定编号为1的层次为1,编号为2,3,4,的层次为2,编号5,6,7,8层次为3,以此类推。
这便有了对如何从树叶层开始建树?中的方法的改进。
每一次循环只处理某一个层次的所有子节点,合并子节点,自然就不会出现混乱。而如何从树叶层开始建树?中的方法之所以不能处理此处的情况,便因为是里边的方法可能在某一次循环中处理了不同层次的节点,导致最后的错误。
核心代码如下:
public static void TestGeTree( ) { List<TreeNode> listAllNodes = GetAllNode(); Dictionary<int, List<TreeNode>> dicNode = GetLeafNode(); List<TreeNode> list = GeTree(listAllNodes, dicNode); } public static List<TreeNode> GetAllNode() { List<TreeNode> listAllNodes = new List<TreeNode>(); listAllNodes.Add(GetNode(1, null, 1));//根节点 listAllNodes.Add(GetNode(2, 1, 2));//第二层节点 listAllNodes.Add(GetNode(3, 1, 2)); listAllNodes.Add(GetNode(4, 1, 2)); listAllNodes.Add(GetNode(5, 2, 3));//第三层节点 listAllNodes.Add(GetNode(6, 2, 3)); listAllNodes.Add(GetNode(7, 3, 3)); listAllNodes.Add(GetNode(8, 3, 3)); listAllNodes.Add(GetNode(9, 5, 4));//第四层节点 listAllNodes.Add(GetNode(10, 5, 4)); listAllNodes.Add(GetNode(11, 7, 4)); listAllNodes.Add(GetNode(12, 7, 4)); listAllNodes.Add(GetNode(13, 9, 5)); return listAllNodes; } public static Dictionary<int, List<TreeNode>> GetLeafNode() { Dictionary<int, List<TreeNode>> dicNodeleafNode = new Dictionary<int, List<TreeNode>>(); dicNodeleafNode.Add(2, new List<TreeNode>(){GetNode(6, 2, 3)}); dicNodeleafNode.Add(5, new List<TreeNode>() { GetNode(10, 5, 4) }); dicNodeleafNode.Add(7, new List<TreeNode>() { GetNode(12, 7, 4) }); dicNodeleafNode.Add(3, new List<TreeNode>() { GetNode(8, 3, 3) }); dicNodeleafNode.Add(1, new List<TreeNode>() { GetNode(4, 1, 2) }); return dicNodeleafNode; } private static TreeNode GetNode(int NodeID, int? parentid, int m_level) { TreeNode node1 = new TreeNode(); node1.NodeID = NodeID; node1.NodeName = "node" + NodeID; node1.ParentID = parentid; node1.m_level = m_level; return node1; }