从父子结构算法创建完整的层次结构字符串,递归

时间:2021-04-14 07:16:13

标签: algorithm recursion

我正在解决以下任务。有一个给定的元素层次结构。我有最低的元素(基础),我需要创建完整的层次结构字符串。我有一个函数,它返回一个元素的父元素。这意味着我可以要求父母,然后是父母的父母,等等。

示例:B 是 A 的父级,[C1, C2] 是 B 的父级,...

Example

在这个例子中,结果应该是 3 个字符串的数组(第 1、2、3 行),每个字符串都包含基本元素 A 的完整层次结构。

这是我的伪代码函数:

Function getAllParents (Element)

    ParentCount = getParentCount(Element)
    result = Element
    IF (ParentCount > 0) THEN
        FOR i = 0 to ParentCount
            ParentName = getParentName(Element, i)
            result =  result + "," + getAllParents(parent)
        NEXT
    END IF
    
    IF (ParentCount = 0) then       
        result =  result + &newLine
    END IF
    
    RETURN result

END Function

它为我的示例提供了以下结果:

A,B,C1,D1,E1 
C2,D2,E2  
E3

如何达到预期的效果?:

A,B,C1,D1,E1
A,B,C2,D2,E2
A,B,C2,D2,E3

2 个答案:

答案 0 :(得分:1)

我们必须在进入的过程中构建当前的 line,并在递归的退出过程中将返回的行连接在一起作为 result。这是一个伪代码:

Function getAllParents (line, Element)
    result = “”
    ParentCount = getParentCount(Element)
    IF (ParentCount > 0) THEN
        FOR i = 0 to ParentCount
            ParentName = getParentName(Element, i)
            result_i = getAllParents(copy(line)+”,”+ParentName, ParentName)
            result = result + result_i
        NEXT
    ELSE
        result = copy(line)+&newLine
    END IF
    
    RETURN result

END Function

每次到达终端节点时都会向 newline 添加一个 line,就像在您的表中一样。

我们称之为getAllParents( “A”, “A”)

为了更好地理解它是如何工作的,以下是您示例的函数调用流程:

(“A”, “A”)
- (“A,B”, “B”)
- - (“A,B,C1”, “C1”)
- - - (“A,B,C1,D1”, “D1”)
- - - - (“A,B,C1,D1,E1”, “E1”)
- - (“A,B,C2”, “C2”)
- - - (“A,B,C2,D2”, “D2”)
- - - - (“A,B,C2,D2,E2”, “E2”)
- - - - (“A,B,C2,D2,E3”, “E3”)

答案 1 :(得分:0)

正如您在问题描述中所说,问题在于结果类型:“结果应该是数组。”

这是一个 JavaScript 示例:

function getParentCount(el, ps){
  return ps[el] && ps[el].length
}

function getParentName(el, i, ps){
  return ps[el][i]
}
    
function getAllParents(el, ps){
  const ParentCount = getParentCount(el, ps)
  
  const result = []
  
  if (ParentCount > 0){
    for (let i=0; i<ParentCount; i++){
      const ParentName = getParentName(el, i, ps)
      const ParentPaths = getAllParents(ParentName, ps)
      
      for (let path of ParentPaths)
        result.push(el + "," + path)
    }
        
  } else {
    result.push(el)
  }
  
  return result
}

const parents = {
  A: ['B'],
  B: ['C1', 'C2'],
  C1: ['D1'],
  C2: ['D2'],
  D1: ['E1'],
  D2: ['E2', 'E3']
}

for (let path of getAllParents('A', parents))
  console.log(path)

相关问题