(LeetCode 863) 二叉樹中所有距離為 K 的結點 [DFS + 新增父節點資訊]
阿新 • • 發佈:2019-01-01
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; } };