C#树类型及其遍历

最近有个项目不仅需要取部门的层级关系,还要处理不规则的关系(移除某个部门),只有树结构才能实现相关遍历和操作。

涉及到的知识点:泛型、递归、数据结构

既然研究树类型就先来看下树的定义:

一棵树(tree)是由n(n>0)个元素组成的有限集合,其中:

(1)每个元素称为结点(node);

(2)有一个特定的结点,称为根结点或根(root);

(3)除根结点外,其余结点被分成m(m>=0)个互不相交的有限集合,而每个子集又都是一棵树(称为原树的子树);——百度

本文将简化树,只研究树的结点-结点树。结点树包含:父结点(根结点的父结点为null)、子结点(List集合)、数据对象。

类的设计:

public class BoTree<T>
    {
        public BoTree()
        {
            nodes = new List<BoTree<T>>();
        }

        public BoTree(T data)
        {
            this.Data = data;
            nodes = new List<BoTree<T>>();
        }

        private BoTree<T> parent;
        /// <summary>
        /// 父结点
        /// </summary>
        public BoTree<T> Parent
        {
            get { return parent; }
        }
        /// <summary>
        /// 结点数据
        /// </summary>
        public T Data { get; set; }

        private List<BoTree<T>> nodes;
        /// <summary>
        /// 子结点
        /// </summary>
        public List<BoTree<T>> Nodes
        {
            get { return nodes; }
        }
        /// <summary>
        /// 添加结点
        /// </summary>
        /// <param name="node">结点</param>
        public void AddNode(BoTree<T> node)
        {
            if (!nodes.Contains(node))
            {
                node.parent = this;
                nodes.Add(node);
            }
        }
        /// <summary>
        /// 添加结点
        /// </summary>
        /// <param name="nodes">结点集合</param>
        public void AddNode(List<BoTree<T>> nodes)
        {
            foreach (var node in nodes)
            {
                if (!nodes.Contains(node))
                {
                    node.parent = this;
                    nodes.Add(node);
                }
            }
        }
        /// <summary>
        /// 移除结点
        /// </summary>
        /// <param name="node"></param>
        public void Remove(BoTree<T> node)
        {
            if (nodes.Contains(node))
                nodes.Remove(node);
        }
        /// <summary>
        /// 清空结点集合
        /// </summary>
        public void RemoveAll()
        {
            nodes.Clear();
        }
    }

测试:

首先创建一个学生类(任意)

public class Student
    {
        public Student(string name, string sex, int age)
        {
            this.Name = name;
            this.Sex = sex;
            this.Age = age;
        }
        public string Name { get; set; }
        public string Sex { get; set; }
        public int Age { get; set; }
    }

初始化树:

BoTree<Student> tree1 = new BoTree<Student>();
tree1.Data = new Student("小波1", "男", 18);

BoTree<Student> tree2 = new BoTree<Student>();
tree2.Data = new Student("小波2", "男", 19);

BoTree<Student> tree3 = new BoTree<Student>();
tree3.Data = new Student("小波3", "男", 20);

BoTree<Student> tree4 = new BoTree<Student>();
tree4.Data = new Student("小波4", "男", 21);

tree1.AddNode(tree2);
tree1.AddNode(tree3);
tree3.AddNode(tree4);

调试:

可以从监视中看出tree1有2个子结点

可以看出tree4的父结点为tree3

下面我们来遍历这棵树:

public static void Recursive(BoTree<Student> tree)
        {
            Console.WriteLine("姓名:{0},姓名:{1},年龄:{2}", tree.Data.Name, tree.Data.Sex, tree.Data.Age);
            if (tree.Nodes.Count > 0)
            {
                foreach (var item in tree.Nodes)
                {
                    Recursive(item);
                }
            }
        }

调用结果:

时间: 2024-10-15 02:10:02

C#树类型及其遍历的相关文章

作业 树和森林 遍历(递归/非递归先序,递归/非递归后序,递归层次)

1 #include <iostream> 2 #include"queue.h"//之前写的类 3 #include"stack.h" //之前写的类 4 using namespace std; 5 6 template <class T> 7 class Tree; 8 9 //======================================== 10 // 树节点类声明 11 template <class T>

树的深度优先遍历和广度优先遍历非递归实现.

注:树的深度优先遍历就是二叉树的先序遍历. 下面是代码. 1 package tooffer; 2 3 import java.util.LinkedList; 4 import java.util.Stack; 5 6 public class TreeNode { 7 int val = 0; 8 TreeNode left = null; 9 TreeNode right = null; 10 11 public TreeNode(int val) { 12 this.val = val;

树的递归遍历

树是一个由n个有限节点组成并具有层次关系的集合,是一种非线性的数据结构.树是由跟节点和它的子树构成,所以树的定义是递归的.二叉树是树的一种,它的特点是至多有两颗字树,并且二叉树的子树也有左右之分,不能互相颠倒. 二叉树常用的遍历方式有三种,即:前序遍历,中序遍历,后序遍历,这三遍历方式的主要却别是访问根结点和遍历左子树.右子树的先后关系不一样. 访问顺序: 前序遍历:根->左->右 中序遍历:左->根->右 后序遍历:左->右->根 下面由树的递归建立和对树进行递归遍历

数据结构与算法-----&gt;数据结构-----&gt;树-------&gt;二叉树的遍历

二叉树的遍历 第一部分 基本概念以及编程实现 概述: 遍历树,就是指按照一定的顺序访问树中的所有节点. 遍历树有三种常用方法,分别是中序遍历(inorder).前序遍历(preorder).后序遍历(postorder) 三种遍历方法的三个步骤都是相同的,只不过这三个步骤的执行顺序不同.三种遍历方式的名称的由来是根据""访问节点内容""这个步骤的执行时间来定的,这个步骤在第一步执行的是前序遍历,在第二步执行的是中序遍历,在第三步执行的是后序遍历. 1.1中序遍历(i

Tree(树的还原以及树的dfs遍历)

紫书:P155 uva  548 You are to determine the value of the leaf node in a given binary tree that is the terminal node of a path of least value from the root of the binary tree to any leaf. The value of a path is the sum of values of nodes along that path

数据结构:树的BFS,树的层次遍历! 按先序遍历创建一棵树,然后以层次遍历输出。

按先序遍历创建一棵树,以层次遍历输出 样例输入 A B # D # # C E # # F # # 样例输出 LevelOrder: A B C D E F 代码: #include <iostream> #include <queue> using namespace std; struct node { //表示一个树上的节点 char ch; node *left, *right; }; node* creat() { //以递归的方式构造一棵二叉树 node *root =

树的深度优先遍历和广度优先遍历的原理和java实现代码

import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode left; TreeNode right; public TreeNode(int value){ this.value=value; } } TreeNode root; public BinaryTree(int[] array){ root=makeBinaryTreeByArray(array,

[深入学习C#]表达式树类型——Expression tree types

表达式树允许将 lambda 表达式表示为数据结构而非可执行代码.表达式目录树是System.Linq.Expressions.Expression< D > 形式的表达式目录树类型 (expression tree type) 的值,其中 D 是任何委托类型. 如果存在从 lambda 表达式到委托类型 D 的转换,则也存在到表达式树类型 Expression< D > 的转换.而lambda 表达式到委托类型的转换生成引用该 lambda 表达式的可执行代码的委托,到表达式树类

1127 ZigZagging on a Tree (30 分)树的层次遍历

1127 ZigZagging on a Tree (30 分) Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences. And it is a simple standard routine to pr