863. 二叉树中所有距离为 K 的结点


首先要将二叉树转换成图,再用bfs做。
1,二叉树转换成图
用哈希表存当前节点和与其相连的点;
通过当前节点于其父节点实现遍历;

点击查看代码
    unordered_map<TreeNode*, vector<TreeNode*>> graph;
    void createGraph(TreeNode* node, TreeNode* parent) {
        if (!node) return;
        if (parent) {
            graph[node].push_back(parent);
            graph[parent].push_back(node);
        }
        createGraph(node->left, node);
        createGraph(node->right, node);
    }
2,bfs实现 用unordered_set存储访问的节点; 求相距k的所有的节点,再while循环后queue中就是目标内容;

完整代码:

点击查看代码
class Solution {
public:
    unordered_map<TreeNode*, vector<TreeNode*>> graph;
    void createGraph(TreeNode* node, TreeNode* parent) {
        if (!node) return;
        if (parent) {
            graph[node].push_back(parent);
            graph[parent].push_back(node);
        }
        createGraph(node->left, node);
        createGraph(node->right, node);
    }

    vector<int> distanceK(TreeNode* root, TreeNode* target, int k) {
        createGraph(root, nullptr);
        queue<TreeNode*> q;
        q.push(target);
        unordered_set<TreeNode*> visited;
        visited.insert(target);

        while (!q.empty() && k > 0) {
            int size = q.size();
            for (int i = 0; i < size; i++) {
                TreeNode* node = q.front();
                q.pop();
                for (TreeNode* neighbor : graph[node]) {
                    if (visited.find(neighbor) == visited.end()) {
                        q.push(neighbor);
                        visited.insert(neighbor);
                    }
                }
            }
            k--;
        }

        vector<int> result;
        while (!q.empty()) {
            TreeNode* node = q.front();
            q.pop();
            result.push_back(node->val);
        }
        return result;
    }
};

posted @ 2024-02-13 21:29  yun-che  阅读(27)  评论(0)    收藏  举报