程序员面试金典--面试23之求出满二叉树a和b点的最近公共祖先的编号

题目描述

有一棵无穷大的满二叉树,其结点按根结点一层一层地从左往右依次编号,根结点编号为1。现在有两个结点a,b。请设计一个算法,求出a和b点的最近公共祖先的编号。

给定两个int a,b。为给定结点的编号。请返回a和b的最近公共祖先的编号。注意这里结点本身也可认为是其祖先。

测试样例:

2,3

返回:1

分析:这道题因为说了是满二叉树,所以父节点的编号是孩子节点的编号除以2,两个节点的编号那个大就除2,直到有一个时刻两个节点的编号第一次相等,这就是最近的公共祖先编号。

#include<iostream>
using namespace std;


int GetLCA(int a,int b)
{
	int parenta = a;
	int parentb = b;

	while(parenta > 0 && parentb > 0)
	{
		if(parenta  > parentb)
		{
			parenta = parenta / 2;
		}
		else if(parenta < parentb)
		{
			parentb = parentb / 2;
		}
		else
			return parenta;
	}
	return -1;
}

void test()
{
	cout << GetLCA(8,11)<<endl;
}

int main()
{
	test();

	cout << "hello..."<<endl;
	return 0;
}
    原文作者:满二叉树
    原文地址: https://blog.csdn.net/hj605635529/article/details/71105394
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞