树与二叉树——二叉树寻找公共祖先

156 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目:已知一棵二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为i和j的两个结点的最近公共祖先节点的值。

思路:

  1. 使用数组存储二叉树

  2. 空缺位置使用-1表示 如 image.png{-1,1,2,3,-1,4,-1,5,-1,-1,6,-1};

  3. 有二叉树性质得出 节点的双亲结点为结点编号/2向下取整

  4. 如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;
}