/// <summary> /// Проверка наличия вхождения поддерева в текущем дереве /// </summary> /// <param name="entry">Вхождение поддерева</param> /// <returns>true, если поддерево содержится в текущем дереве</returns> internal bool Contains(SubtreeEntry entry) { if (entry == null) { return(false); } if (entry.TreeId != TreeId || entry.RootIndex != RootIndex) { return(false); } if (DfsCode.Count < entry.DfsCode.Count) { return(false); } if (RightMostIndex < entry.RightMostIndex) { return(false); } for (int i = 1; i < entry.DfsCode.Count; i++) { if (!DfsCode.Contains(entry.DfsCode[i])) { return(false); } } return(true); }
/// <summary> /// Добавить вхождение поддерева /// </summary> /// <param name="entry">Вхождение поддерева</param> /// <returns>1 - единственное дерево на крайнем правом пути, иначе 0</returns> internal int AddEntry(SubtreeEntry entry) { if (!RootDictionary.ContainsKey(entry.RootIndex)) { RootDictionary.Add(entry.RootIndex, new RootEntry(TreeId, entry.Depth, entry.RootIndex)); } return(RootDictionary[entry.RootIndex].AddEntry(entry)); }
/// <summary> /// Проверка, содержится ли вхождение поддерева на крайнем правом пути (имеет крайний правый лист дерева) /// </summary> /// <param name="entry">Вхождение поддерева</param> /// <returns>true, если вхождение поддерева есть на крайнем правом пути</returns> internal bool ContainsEntry(SubtreeEntry entry) { if (RightMostList == null || RightMostList.Count == 0) { return(false); } return(RightMostList.Any(t => t.RightMostIndex == entry.RightMostIndex)); }
/// <summary> /// Добавить вхождение дерева в словарь /// </summary> /// <param name="entry">Вхождение дерева</param> /// <returns></returns> internal int AddEntry(SubtreeEntry entry) { Debug.Assert(entry.Depth == Depth, "Разная глубина деревьев"); if (!TreeEntriesDictionary.ContainsKey(entry.TreeId)) { TreeEntriesDictionary.Add(entry.TreeId, new TreeEntries(entry.TreeId)); } return(TreeEntriesDictionary[entry.TreeId].AddEntry(entry)); }
/// <summary> /// Добавить вхождение поддерева для текущего корня /// </summary> /// <param name="entry">Вхождение поддерева</param> /// <returns>1, если на крайнем правом пути есть 1 поддерево, иначе 0</returns> internal int AddEntry(SubtreeEntry entry) { Debug.Assert(entry.TreeId == TreeId && entry.RootIndex == RootIndex); if (RightMostList == null) { RightMostList = new List <SubtreeEntry>(); } RightMostList.Add(entry); return(RightMostList.Count == 1 ? 1 : 0); }
/// <summary> /// Соединение 2 вхождений поддеревьев /// </summary> /// <param name="entryToBeConnected">Вхождение поддерева, с которым соединяется текущее поддерево</param> /// <returns>Новое вхождение поддерева</returns> internal SubtreeEntry Connect(SubtreeEntry entryToBeConnected) { Debug.Assert(entryToBeConnected != null); Debug.Assert(TreeId == entryToBeConnected.TreeId); Debug.Assert(RightMostIndex == entryToBeConnected.RootIndex); List <int> dfsList = new List <int> { RootIndex }; dfsList.AddRange(entryToBeConnected.DfsCode); return(Create(TreeId, Depth, dfsList)); }
/// <summary> /// Добавить вхождение дерева в словарь вхождений по глубинам /// </summary> /// <param name="entry">Вхождение дерева</param> internal void AddEntry(SubtreeEntry entry) { if (!DepthEntriesDictionary.ContainsKey(entry.Depth)) { DepthEntriesDictionary.Add(entry.Depth, new DepthEntries(entry.Depth)); } if (!DepthEntriesDictionary[entry.Depth].ContainsEntry(entry)) { if (!SupportTreeSet.Contains(entry.TreeId)) { SupportTreeSet.Add(entry.TreeId); } DepthEntriesDictionary[entry.Depth].AddEntry(entry); } }
/// <summary> /// Комбинирование 2 вхождений поддеревьев /// </summary> /// <param name="entryToBeCombined">Вхождение поддерева, с которым комбинируется текущее поддерево</param> /// <returns>Новое вхождение поддерева</returns> internal SubtreeEntry Combine(SubtreeEntry entryToBeCombined) { Debug.Assert(entryToBeCombined != null); Debug.Assert(TreeId == entryToBeCombined.TreeId); Debug.Assert(RootIndex == entryToBeCombined.RootIndex); Debug.Assert(RightMostIndex < entryToBeCombined.SecondIndex); List <int> dfsList = new List <int>(DfsCode); for (int i = 1; i < entryToBeCombined.DfsCode.Count; i++) { dfsList.Add(entryToBeCombined.DfsCode[i]); } return(Create(TreeId, Depth, dfsList)); }
/// <summary> /// Проверка, если ли вхождение дерева в словаре /// </summary> /// <param name="entry"></param> /// <returns></returns> internal bool ContainsEntry(SubtreeEntry entry) { return(TreeEntriesDictionary.ContainsKey(entry.TreeId) && TreeEntriesDictionary[entry.TreeId].ContainsEntry(entry)); }
/// <summary> /// Проверка наличия вхождения дерева /// </summary> /// <param name="entry">Вхождение дерева</param> /// <returns>true, если есть вхождение дерева</returns> internal bool ContainsEntry(SubtreeEntry entry) { return(RootDictionary.ContainsKey(entry.RootIndex) && RootDictionary[entry.RootIndex].ContainsEntry(entry)); }