腾讯笔试完全二叉排序树

大家看一下我的解法,有没有问题,可以一起讨论一下~大致的思路就是找到最大数和最小数之间的2的最大幂次的倍数。
从最大的2^(k-1)次幂开始除起,看在哪一个幂次时max/2^i不等于min/2^i,就说明公共根节点时2^i的倍数
// tencent_BST.cpp : Defines the entry point for the console application.
//

#include<stdio.h>
#include<math.h>
int main()
{
	int k, a, b, c;
	scanf("%d %d %d %d",&k,&a,&b,&c);
	int i = k - 1;
	int tempmax = a>b ? a : b;
	int max = tempmax > c ? tempmax : c;
	int tempmin = a < b ? a : b;
	int min = tempmin < c ? tempmin : c;//求最大最小值
	while (i >= 0)
	{
		int tempa = max / (int)pow(2, i);
		int tempb = min / (int)pow(2, i);
		if (tempa == tempb)
			i--;
		else
			break;
	}//找到根节点是2^i的倍数
      printf("%d\n",(int)((max/(int)pow(2,i))*pow(2,i)));
     return 0;
}

全部评论
不建议使用pow,有精度误差。2的幂用位运算。
点赞 回复 分享
发布于 2017-04-04 08:31
思路应该没问题。昨天就是把第二题写了。这个二叉树没写。真伤心
点赞 回复 分享
发布于 2017-04-04 10:11
你的pow可以定义一个变量存着,然后每次除以2..
点赞 回复 分享
发布于 2017-04-04 12:26
很多子树根节点不是2^i的倍数呢。这样做可能不行? 可以从根节点往下,根据BST的性质,二分寻找。
点赞 回复 分享
发布于 2017-04-04 16:58
#include <iostream> #include <math.h> using namespace std; int main() {     int k,a,b,c;     cin>>k>>a>>b>>c;     int i = 1,j = pow(2,k)-1;     int mid;     while(true)     {         mid = (i + j) / 2;         if(a < mid && b < mid && c < mid)         {             j = mid - 1;             continue;         }         if(a > mid && b > mid && c > mid)         {             i = mid + 1;             continue;         }         break;     }     cout<<mid<<endl;     return 0; }
点赞 回复 分享
发布于 2017-04-04 20:36

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务