Code & Func
2019-03-07

第8天,感觉快要把每天刷题的习惯找回来了。。。

今天的题目是All Nodes Distance K in Binary Tree

这道题可以分为几个部分来解决:

  • 寻找target节点
  • 向下寻找距离当前节点K步的节点
  • target节点向前寻找

虽说是三部分,但是在实现“寻找target节点”的时候,我们需要考虑到如何向前寻找,我们先把“向下寻找距离当前节点K步的节点”实现了。

很容易发现,这是一个递归的过程,做遍历的时候维护好K值即可,然后加一些判断条件就能实现了。

如果忽略掉“从target节点向前寻找”这个要求,我们要怎么实现寻找target节点呢?

也是一个很简单的问题,就直接用递归形式的先序遍历即可,遍历时判断当前节点是否为target节点。

现在就剩下最后一部分了,也是这道题的难点所在。

要实现向前移动,我们可以利用“寻找target节点”的一些信息,通过一个返回值来确定,是否在某个子分支中找到 target 节点:

如果找到了,我们就可以从当前节点开始向另一个分支寻找了,因为需要计算到target节点的距离,所以我们干脆把返回值设置为还需要走多少步才能到达”距离target节点K步“的位置,故:

1
/**
2
* Definition for a binary tree node.
3
* struct TreeNode {
4
* int val;
5
* TreeNode *left;
6
* TreeNode *right;
7
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
8
* };
9
*/
10
class Solution {
11
public:
12
vector<int> distanceK(TreeNode* root, TreeNode* target, int K) {
13
vector<int> res;
14
if (root == nullptr || target == nullptr) return res;
15
downSearch(res, target, K);
36 collapsed lines
16
findTarget(res, root, target, K);
17
return res;
18
}
19
20
int findTarget(vector<int> &res, TreeNode *root, TreeNode *target, int K) {
21
if (root == nullptr) return -1;
22
if (root == target) return K - 1;
23
24
// left
25
int left_k = findTarget(res, root->left, target, K);
26
if (left_k == 0) {
27
res.push_back(root->val); return left_k - 1;
28
} else if (left_k > 0) {
29
downSearch(res, root->right, left_k-1);
30
return left_k - 1;
31
}
32
33
int right_k = findTarget(res, root->right, target, K);
34
if (right_k == 0) {
35
res.push_back(root->val); return right_k - 1;
36
} else if (right_k > 0) {
37
downSearch(res, root->left, right_k-1);
38
return right_k - 1;
39
}
40
return -1;
41
}
42
43
void downSearch(vector<int> &res, TreeNode* p, int K) {
44
if (p == nullptr || K < 0) return ;
45
if (K == 0) {
46
res.push_back(p->val); return;
47
}
48
downSearch(res, p->left, K-1);
49
downSearch(res, p->right, K-1);
50
}
51
};
上一条动态