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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace offerTest.Helper { class TreeHelper { ///  /// 根据数组按顺序从上到下生成树 ///  /// 生成树的节点数据,无节点的位置需要设置为null,一个有值的节点必须设置两个左右子节点。 ///  public static TreeNode CreateTreeByArry(int?[] arrayTree) { Queue treeNodes = new Queue(); 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; } ///  /// 为父节点赋左右子节点值,null父节点不操作。 ///  /// 数据源 /// 开始填充的值的索引 /// 需要赋子节点的父节点队列 ///  public static bool CreateTree(int?[] arrayTree, int StartIndex, Queue Qroot) { if (StartIndex > 0 && arrayTree.Count() > StartIndex) { Queue treeNodes = new Queue(); 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; } } }

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

数据结构与算法——Tree数据结构的生成(C#)_第1张图片

你可能感兴趣的:(数据结构与算法——Tree数据结构的生成(C#))