📜  门| GATE-CS-2007 |第80章(1)

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

GATE-CS-2007: 第80章

本章提供了有关计算机科学入门考试(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)。