如何用树中的所有子节点替换节点

时间:2019-07-10 21:53:58

标签: algorithm tree graph-algorithm

我想知道如何用其子节点替换非二叉树的节点。例如,我将从这样的结构开始:

        a
     / / \ \
    b  c  d e
   /\  /    /\\
  f  g h    i jk

如果我将节点e的目标替换为其子节点,则结束此操作

          a
     / / \ \ \ \
    b  c  d i j k
   /\  / 
  f  g h    

在JSON中,初始结构如下:

{
  "id": "a",
  "children": [
    {
      "id": "b",
      "children": [
        {
          "id": "f",
          "children": []
        },
        {
          "id": "g",
          "children": []
        }
      ]
    },
    {
      "id": "c",
      "children": [
        {
          "id": "h",
          "children": []
        }
      ]
    },
    {
      "id": "d",
      "children": []
    },
    {
      "id": "e",
      "children": [
        {
          "id": "i",
          "children": []
        },
        {
          "id": "j",
          "children": []
        },
        {
          "id": "k",
          "children": []
        }
      ]
    }
  ]
}

1 个答案:

答案 0 :(得分:0)

如果稍微更改JSON结构,您的问题将变得更加容易。 对于每个节点,请存储每个节点的父级及其直接子级。

新的JSON结构

[
  {"id": "a", "parent": null, "children" : ["b", "c", "d", "e"] },
  {"id": "b", "parent": "a",  "children" : ["f", "g"]},
  {"id": "c", "parent": "a",  "children" : ["h"]},
  {"id": "d", "parent": "a",  "children" : []},
  {"id": "e", "parent": "a",  "children" : ["i", "j", "k"]}
]

算法

可以说您的目标节点是e

现在您需要做的就是将e的直系子代的父母更改为a,因为ae的父母。然后删除e

这将保留e的子级的子树结构。如果您不希望这样做,则必须将a的父级递归地分配给e的所有子级,而不仅仅是直接的子级。