📌  相关文章
📜  给定树中从根到第 N 个节点的路径中的节点总和(1)

📅  最后修改于: 2023-12-03 15:27:35.679000             🧑  作者: Mango

返回树中从根到第 N 个节点的路径节点总和

在树中,从根到某个节点的路径可以通过递归方法来找到。对于给定的树和目标节点N,我们可以定义一个递归函数,来计算根节点到N的路径节点总和。

算法实现
递归方法

我们可以定义一个递归函数来计算从根节点到目标节点N的路径节点总和。

int sum = 0;

public int sumNodes(TreeNode root, int N) {
    if (root == null) {
        return 0;
    }
    dfs(root, N, 0);
    return sum;
}

public void dfs(TreeNode root, int N, int pathSum) {
    if (root == null) {
        return;
    }
    pathSum += root.val;
    if (root.val == N) {
        sum = pathSum;
    }
    dfs(root.left, N, pathSum);
    dfs(root.right, N, pathSum);
}

该递归函数接收两个参数:当前节点root 和目标节点N。我们可以在递归过程中计算节点和,和每一次递归节点的子节点。

非递归方法

我们也可以使用非递归方法来实现该算法,使用一个栈来存储根节点到每个递归节点的路径节点总和。如果节点的值等于目标节点N,我们就可以找到根节点到N的路径节点总和。

public int sumNodes(TreeNode root, int N) {
    if (root == null) {
        return 0;
    }
    Stack<Pair<TreeNode, Integer>> stack = new Stack<>();
    stack.push(new Pair<>(root, root.val));
    while (!stack.isEmpty()) {
        Pair<TreeNode, Integer> pair = stack.pop();
        TreeNode node = pair.getKey();
        int pathSum = pair.getValue();
        if (node.val == N) {
            return pathSum;
        }
        if (node.left != null) {
            stack.push(new Pair<>(node.left, pathSum + node.left.val));
        }
        if (node.right != null) {
            stack.push(new Pair<>(node.right, pathSum + node.right.val));
        }
    }
    return 0;
}
时间复杂度和空间复杂度

递归方法和非递归方法的时间复杂度都是 O(N),其中 N是树节点的数量。空间复杂度取决于递归深度或栈的大小,最坏情况下,空间复杂度为 O(N)。

总结

给定一个树和目标节点N,我们可以使用递归或非递归方法求出从根节点到N的路径节点总和。递归方法和非递归方法的时间复杂度都是 O(N),空间复杂度最坏情况下都是 O(N)。