📅  最后修改于: 2023-12-03 15:42:16.652000             🧑  作者: Mango
本章提供了有关计算机科学入门考试(GATE-CS)中的第80个问题的解决方案。
题目要求我们在一个二叉树中寻找距离根节点为k的所有节点,并将它们存储在一个数组中。
我们可以使用递归的方式来遍历整个二叉树,并将距离根节点为k的所有节点添加到结果数组中。
下面是一个Java程序的示例,它实现了上述算法:
/**
* TreeNode表示二叉树的节点
*/
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class Solution {
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
List<Integer> res = new ArrayList<>();
find(root, target, k, res);
return res;
}
/**
* 找到距离目标节点k的所有节点
*
* @param root 二叉树根节点
* @param target 目标节点
* @param k 距离目标节点的距离
* @param res 存储距离目标节点为k的所有节点
* @return 距离目标节点为k的节点数
*/
private int find(TreeNode root, TreeNode target, int k, List<Integer> res) {
if (root == null) {
return -1;
}
if (root == target) {
// 找到目标节点,从此开始向下遍历
subtreeAdd(root, 0, k, res);
return 1;
}
int left = find(root.left, target, k, res);
int right = find(root.right, target, k, res);
if (left != -1) {
// 从左子树中添加节点
if (left == k) {
res.add(root.val);
}
subtreeAdd(root.right, left + 1, k, res);
return left + 1;
} else if (right != -1) {
// 从右子树中添加节点
if (right == k) {
res.add(root.val);
}
subtreeAdd(root.left, right + 1, k, res);
return right + 1;
} else {
return -1;
}
}
/**
* 将所有距离为dist的节点添加到结果中
*
* @param root 当前子树的根节点
* @param dist 当前节点到根节点的距离
* @param k 距离目标节点为k的节点
* @param res 存储距离目标节点为k的所有节点
*/
private void subtreeAdd(TreeNode root, int dist, int k, List<Integer> res) {
if (root == null) {
return;
}
if (dist == k) {
res.add(root.val);
}
subtreeAdd(root.left, dist + 1, k, res);
subtreeAdd(root.right, dist + 1, k, res);
}
}
对于一棵具有n个节点的二叉树,时间复杂度为O(n),空间复杂度为O(n)。