本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目:已知一棵二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为i和j的两个结点的最近公共祖先节点的值。
思路:
-
使用数组存储二叉树
-
空缺位置使用-1表示 如
{-1,1,2,3,-1,4,-1,5,-1,-1,6,-1};
-
有二叉树性质得出 节点的双亲结点为结点编号/2向下取整
-
如i的双亲结点编号为i/2 j的双亲结点编号为j/2
若 i>j 说明i的层次大于或等于j所在层次 则进行 i/=2 然后在进行比较** 若i<j 说明j的层次大于或等于i所在层次 则进行 j/=2 然后在进行比较 第一次i=j时,则此结点为ij的最近公共祖先结点
代码如下:
#include <iostream>
using namespace std;
struct tree
{
int data[12] = {-1,1,2,3,-1,4,-1,5,-1,-1,6,-1};
};
int Comm(tree t,int i,int j){
if(t.data[i] != -1 && t.data[j] != -1){
while(i!=j){
if (i>j) i/=2;
else j/=2;
}
return t.data[i];
}
return -1;
}
int main(){
tree t;
int ans = Comm(t,7,10);
cout<<ans<<endl;
}