1. 程式人生 > >(LeetCode 863) 二叉樹中所有距離為 K 的結點 [DFS + 新增父節點資訊]

(LeetCode 863) 二叉樹中所有距離為 K 的結點 [DFS + 新增父節點資訊]

863. 二叉樹中所有距離為 K 的結點
給定一個二叉樹(具有根結點 root), 一個目標結點 target ,和一個整數值 K 。

返回到目標結點 target 距離為 K 的所有結點的值的列表。 答案可以以任何順序返回。

示例 1:

輸入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2

輸出:[7,4,1]
在這裡插入圖片描述
注意,輸入的 “root” 和 “target” 實際上是樹上的結點。
上面的輸入僅僅是對這些物件進行了序列化描述。

提示:

1:給定的樹是非空的,且最多有 K 個結點。
2:樹上的每個結點都具有唯一的值 0 <= node.val <= 500 。
3:目標結點 target 是樹上的結點。
4:0 <= K <= 1000.

分析:
由於題目中的樹是使用指標構建的,對於每個節點,我們可以很方便的獲得子節點的資訊,但是無法直接獲得父節點的資訊。
在搜尋距離某個節點target距離為K的所有節點時,我們不僅需要往子節點的方向上搜索,還要往父節點的方向上搜索,所以:
(1)首先進行DFS,獲取每個節點的父節點的資訊,存在一個father陣列中。這好比對於每個節點,我們添加了一條通往父節點的邊。
(2)再進行一次DFS(或BFS),查詢所有距離target為K的節點資訊。
每次可以往 1: 左子節點 2:右子節點 3:父節點 這3個方向進行搜尋。
為了避免重複搜尋,使用 f 陣列對已經查詢過的節點進行標記。

AC程式碼:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode * father[510];
    int f[510];
    
    void getFather(TreeNode* current)
    {
        if(current->left != NULL)
        {
            father[current->left->val] = current;
            getFather(current->left);
        }
        if(current->right != NULL)
        {
            father[current->right->val] = current;
            getFather(current->right);
        }
    }
    
    void getAns(TreeNode* c, int d, int k, vector<int>& ans)
    {
        if(d == k)
        {
            ans.push_back(c->val);
            return;
        }
        if(c->left != NULL && f[c->left->val] == 0)
        {
            f[c->left->val] = 1;
            getAns(c->left,d+1,k,ans);
        }
        if(c->right != NULL && f[c->right->val] == 0)
        {
            
            f[c->right->val]  = 1;
            getAns(c->right,d+1,k,ans);
        }
        if(father[c->val] != NULL && f[father[c->val]->val] == 0)
        {
            f[father[c->val]->val] = 1;
            getAns(father[c->val],d+1,k,ans);
        }
    }
        
    vector<int> distanceK(TreeNode* root, TreeNode* target, int K) {
        vector<int> ans;
        memset(father,NULL,sizeof(father));
        getFather(root);
        memset(f,0,sizeof(f));
        f[target->val] = 1;
        getAns(target,0,K,ans);
        return ans;
    }
};