题目大意是,找到最临近给定节点的叶节点,例如
1/ \2 3/4/5/6
给定2的话,最近的是3,给定4的话,最近的是6。
思路:题目中,树的结构并不利于寻找答案,需要把树的结构转换成图,然后通过广度优先搜索,可以轻易的获取最近的叶节点。
代码:
class Solution {public:int findClosestLeaf(TreeNode* root, int k) {kv=k;for(int i=0;i<1010;i++){f[i]=false;v[i]=false;}helper(root);queue<int> q;q.push(k);int res=0;while(q.size()>0){int tk=q.front();if(f[tk] == true)return tk;q.pop();if( v[tk] == false){v[tk]=true;res++;int ns=n[tk].size();for(int i=0;i<ns;i++){int tki=n[tk][i];if(f[tki] == true)return tki;if(v[tki] == false){q.push(tki);}}}}return -1;}void helper(TreeNode* t){if(t == NULL)return;if(t->left == NULL && t->right == NULL){f[t->val]=true;return;}if(t->left !=NULL){n[t->left->val].push_back(t->val);n[t->val].push_back(t->left->val);helper(t->left);}if(t->right !=NULL){n[t->right->val].push_back(t->val);n[t->val].push_back(t->right->val);helper(t->right);}}private:vector<int> n[1010];bool f[1010];bool v[1010];int kv;};
代码结构,是分两步,第一步通过helper函数,将树转化成无权邻域矩阵,第二步,在主函数里通过广度优先搜索,寻找最短路径。