在做劍指offer的題目時,發現每次需要用到樹做為參數來測試自己寫的方法時,都很是痛苦。於是乎就萌生了寫一個利用數據生成樹的方法。簡單測試了下,沒什麼毛病。在這裡貼出來,如果以後發現有bug了會持續在後面更新,也歡迎大家指出其中的不足。 using System; using System.Coll ...
在做劍指offer的題目時,發現每次需要用到樹做為參數來測試自己寫的方法時,都很是痛苦。於是乎就萌生了寫一個利用數組作為參數生成樹的方法。簡單測試了下,沒什麼毛病。在這裡貼出來,如果以後發現有bug了會持續在後面更新,也歡迎大家指出其中的不足。
public class TreeNode
{
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int x)
{
val = x;
}
}
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;
}
}
}
怎麼使用呢?一張自畫圖體會一下