Распечатать все пути от корня до каждого листа - PullRequest
0 голосов
/ 01 марта 2019

Для дерева, где каждому узлу предоставляется следующий кортеж:

(Value, LeftNode, RightNode)

Как можно распечатать все возможные цепочки создания стоимости от корня до каждого листа?

Например: (1, (2, (4, (7, нет, нет), нет), (5, нет, нет)), (3, нет, (6, нет, нет))))

Оно должно представлять следующее дерево:

Example tree

Ожидаемый результат:
[1,2,4,7]
[1,2,5]
[1,3,6]

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Похоже, что вы пытаетесь решить эту проблему: https://leetcode.com/problems/binary-tree-paths/

Здесь вы можете просто начать исследовать дерево с помощью dfs и сохранять значения при переходе в дерево и поддерживатьвектор всех значений от корня до текущего узла.Как только вы закончите обработку этого узла, просто удалите значения текущего узла из этого вектора.Когда мы достигли конечного узла, мы просто добавляем значения в векторе к нашему ответу.

Вот код, реализованный в cpp для вашей ссылки:

/**
* Definition for a binary tree node.
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
 public:
   void solve(TreeNode* root, vector<int>&values, vector<string>&ans) {
    if (root == NULL) return;
    if (root->left == NULL && root->right == NULL) {
        // leaf node
        string str = "";
        values.push_back(root->val);
        str += ::to_string(values[0]);
        for (int i = 1; i < values.size(); ++i) {
            str += "->";
            str += ::to_string(values[i]);
        }
        ans.push_back(str);
        values.pop_back();
        return;
    }
    values.push_back(root->val);
    solve(root->left, values, ans);
    solve(root->right, values, ans);
    values.pop_back();
  }
 vector<string> binaryTreePaths(TreeNode* root) {
    vector<int>values;
    vector<string>ans;
    solve(root,values,ans);
    return ans;
  }
};
0 голосов
/ 01 марта 2019

Вот более читаемый рекурсивный генератор:

def paths(node):
    if node is None:
        return
    val, *children = node
    if any(children):
        for child in children: 
            for path in paths(child):
                yield [val] + path
    else:
        yield [val]

>>> list(paths(root))
[[1, 2, 4, 7], [1, 2, 5], [1, 3, 6]]

Это дает дополнительное преимущество работы с узлами с произвольным числом дочерних элементов.

0 голосов
/ 01 марта 2019

Вы можете использовать рекурсию с генератором:

def get_paths(d, _c = []):
  val, _l, _r = d
  if _l is None and _r is None:
    yield [*_c, val]
  if _l is not None:
    yield from get_paths(_l, _c = _c+[val])
  if _r is not None:
    yield from get_paths(_r, _c = _c+[val])

print(list(get_paths((1,(2,(4,(7,None,None),None),(5, None, None)),(3,None,(6, None,None))))))

Выход:

[[1, 2, 4, 7], [1, 2, 5], [1, 3, 6]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...