📅  最后修改于: 2023-12-03 15:27:35.679000             🧑  作者: Mango
在树中,从根到某个节点的路径可以通过递归方法来找到。对于给定的树和目标节点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)。