当前位置: 移动技术网 > IT编程>开发语言>.net > 数据结构与算法——Tree数据结构的生成(C#)

数据结构与算法——Tree数据结构的生成(C#)

2020年04月09日  | 移动技术网IT编程  | 我要评论

服装厂招工简章,东盟网,2014年6月里番

在做剑指offer的题目时,发现每次需要用到树做为参数来测试自己写的方法时,都很是痛苦。于是乎就萌生了写一个利用数据生成树的方法。简单测试了下,没什么毛病。在这里贴出来,如果以后发现有bug了会持续在后面更新,也欢迎大家指出其中的不足。

using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;

namespace offertest.helper
{
    class treehelper
    {
        /// <summary>
        /// 根据数组按顺序从上到下生成树
        /// </summary>
        /// <param name="arraytree">生成树的节点数据,无节点的位置需要设置为null,一个有值的节点必须设置两个左右子节点。</param>
        /// <returns></returns>
        public static treenode createtreebyarry(int?[] arraytree)
        {
            queue<treenode> treenodes = new queue<treenode>();
            if(arraytree==null ||!arraytree[0].hasvalue)
            {
                throw new argumentexception("生成树的根节点不能为null");
            }
            var root = new treenode(arraytree[0].value);
            treenodes.enqueue(root);
            createtree(arraytree, 1, treenodes);
            return root;
        }

        /// <summary>
        /// 为父节点赋左右子节点值,null父节点不操作。
        /// </summary>
        /// <param name="arraytree">数据源</param>
        /// <param name="startindex">开始填充的值的索引</param>
        /// <param name="qroot">需要赋子节点的父节点队列</param>
        /// <returns></returns>
        public static bool createtree(int?[] arraytree, int startindex, queue<treenode> qroot)
        {
            if (startindex > 0 && arraytree.count() > startindex)
            {
                queue<treenode> treenodes = new queue<treenode>();
                foreach(var root in qroot)
                {
                    //为null代表该节点没有
                    if (root == null)
                        continue;
                    if(arraytree.count() > startindex)
                    {
                        if (arraytree[startindex].hasvalue)
                            root.left = new treenode(arraytree[startindex].value);
                        else
                            root.left = null;
                    }
                    if (arraytree.count() > startindex + 1)
                    {
                        if (arraytree[++startindex].hasvalue)
                            root.right = new treenode(arraytree[startindex].value);
                        else
                            root.right = null;
                    }
                    else
                        return false;
                    //将父节点放入队列,
                    treenodes.enqueue(root.left);
                    treenodes.enqueue(root.right);
                    startindex += 1;
                }
                return !createtree(arraytree, startindex, treenodes);
            }
            else
                return false;
        }
    }
}

怎么使用呢?一张自画图体会一下

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网