C++程序题-2021.08.15

本文探讨了如何在给定的二叉树中计算所有叶子节点对间的距离为k的对数,并提供了针对特定问题的解决方案。同时,介绍了如何将一个整数的二进制中第二个0变为1的操作,通过示例和代码实现来简化数值转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述-一

一颗有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^52<=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;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值