/// <summary> /// 递归寻找方法 /// </summary> /// <param name="inputNode">输入的节点</param> /// <param name="inputValue">输入的值</param> /// <returns>找到的值若为Null则未找到</returns> private KDTreeNode searchRecursion(KDTreeNode inputNode, IDimensionValueBean inputValue) { if (null == inputNode) { return(null); } //若两节点相同 else if (UtilityMethod.IfDDimensionIsEqula (inputNode.ThisDataValue, inputValue, ifUseRecursionCheck)) { //若节点已删除 if (inputNode.IsDeleteTag) { return(null); } else { return(inputNode); } } else { //获取维度索引 int dimensionIndex = inputNode.NowDimisionIndex; //获取多维数据封装 IDimensionValueBean nodeValue = inputNode.ThisDataValue; //获得当前节点维度的值 double tempDimensionValue = nodeValue.GetValueAtDimensionIndex(dimensionIndex); //获得输入数值在节点维度的值 double tempInputValue = inputValue.GetValueAtDimensionIndex(dimensionIndex); //比较两值 CompareResultEnum compareResult = UtilityMethod.CompareDoulbe(tempInputValue, tempDimensionValue); //比较结果调整 compareResult = equalStrategy(compareResult); //次轮迭代使用的节点 KDTreeNode nextRoundNode = null; //若小于去左节点 if (compareResult == CompareResultEnum.Less) { nextRoundNode = inputNode.LeftChild; } //其它去右节点 else { nextRoundNode = inputNode.RightChild; } //递归执行 return(searchRecursion(nextRoundNode, inputValue)); } }
/// <summary> /// 添加节点的递归方法 /// </summary> /// <param name="inputValue">输入的值</param> /// <returns></returns> private bool insertLoopMethod(IDimensionValueBean inputValue) { //当前递归节点 KDTreeNode currentNode = rootNode; //当前节点的父节点 KDTreeNode parentNode = null; //临时节点 KDTreeNode tempNode = null; //父节点的索引 int tempDimensionIndex = -1; //当前节点应当使用的索引 int tempNowIndex = -1; //表征节点前进方向是否是向左节点 bool ifIsLeftTag = true; double tempParentValue = 0.0d; double tempCurrentValue = 0.0d; CompareResultEnum tempCompareResult; //递归寻找添加位点 while (true) { //当前递归层级节点变为父节点 parentNode = currentNode; //获得父节点的索引 tempDimensionIndex = parentNode.NowDimisionIndex; //获得父节点的值 tempParentValue = parentNode.ThisDataValue. GetValueAtDimensionIndex(tempDimensionIndex); //获取此节点的值 tempCurrentValue = inputValue. GetValueAtDimensionIndex(tempDimensionIndex); //比较节点值 tempCompareResult = UtilityMethod. CompareDoulbe(tempCurrentValue, tempParentValue); //按相等策略调整 tempCompareResult = equalStrategy(tempCompareResult); //小于:左子树方向 if (tempCompareResult == CompareResultEnum.Less) { ifIsLeftTag = true; } //其它右子树方向 else { ifIsLeftTag = false; } //获取父节点相应位置处的子节点 currentNode = parentNode.GetChildNode(ifIsLeftTag); //获得子节点的索引 tempNowIndex = GetUseDimensionInde(tempDimensionIndex); if (null == currentNode) { tempNode = new KDTreeNode(inputValue, tempNowIndex); parentNode.SetChildNode(ifIsLeftTag, tempNode); break; } //若多维值相同 if (UtilityMethod.IfDDimensionIsEqula(currentNode.ThisDataValue, inputValue)) { //若需要替换或当前节点是已删除状态 if (ifEqualValueReplace || currentNode.IsDeleteTag) { currentNode.ThisDataValue = inputValue; currentNode.IsDeleteTag = false; } break; } } nodeCount++; return(true); }
/// <summary> /// 比较输入多维数据是否与此节点数据相同 /// </summary> /// <param name="inputValue">输入的多维数据</param> /// <returns>是否相同</returns> internal bool IfEqula(IDimensionValueBean inputValue) { return(UtilityMethod.IfDDimensionIsEqula(this.thisDataValue, inputValue)); }