题目描述-一
一颗有n个节点的二叉树,其根节点为root
,且该二叉树的节点编号为1~n。问题:在所有的叶子节点中,两个叶子节点之间的距离为k的叶子节点对数是多少。输出叶子节点对数。
有如下二叉树:
叶子节点之间距离为3的对数有(4,3),(5,3)一共两对。
e.g:
输入:[1,2,3,4,5],3
输出:2
输入:[1,2,3,4,5],2
输出:1
备注:1<=n<=10^5
,2<=k<=10
参考代码-一
class Solution {
public:
int countPairs(TreeNode* root, int distance) {
int ans = 0;
dfs(root, distance, ans);
return ans;
}
vector<int> dfs(TreeNode* root, int distance, int& ans) {
if (root == nullptr) return {};
if (root->left == nullptr && root->right == nullptr) return { 0 };
vector<int> ret;
auto left = dfs(root->left, distance, ans);
for (auto& e : left) {
if (++e > distance) continue;
ret.push_back(e);
}
auto right = dfs(root->right, distance, ans);
for (auto& e : right) {
if (++e > distance) continue;
ret.push_back(e);
}
for (int l = 0; l < left.size(); l++) {
for (int r = 0; r < right.size(); r++) {
if ((left[l] + right[r]) == distance) {
ans++;
}
}
}
return ret;
}
};
题目描述-二
给定一个正整数num,将其二进制下从低位起的第二个0变为1后,返回改变后的值。
输入:10
输出:14
说明:10的二进制为(1010),将第二个0变为1为(1110)=14
输入:2
输出:6
说明:2的二进制位(010),将第二个0变为1为(110)=6
备注:给定一个整数1<=num<10^9
参考代码-二
class Solution {
public:
int changeNumber(int num) {
int test_num = num;
vector<int> tmp;
while (test_num > 0) {
tmp.push_back(test_num % 2);
test_num = test_num / 2;
}
int zero_num = 0;
for (long long int i = 0; i < tmp.size(); i++) {
if (tmp[i] == 0) {
zero_num++;
}
if (zero_num == 2) {
tmp[i] = 1;
break;
}
}
if (zero_num == 0) {
tmp.push_back(0);
tmp.push_back(1);
}
if (zero_num == 1) {
tmp.push_back(1);
}
int res_num = 0;
for (long long int i = 0; i < tmp.size(); i++) {
res_num = res_num + tmp[i] * pow(2, i);
}
return res_num;
}