#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTNode *T,int N,int root)
{
BiTNode *Node;
BiTNode *Tree[500000]; //建立的是一个结构体指针数组,数组里面的所有元素都是指向BiTNode结构体的指针。
int n1,n2,n3; //**
Tree[root]=T; //在树的数组中"树根"位置是最开始的节点
for(int i=0;i<N;i++)
{
scanf("%d %d %d ",&n1,&n2,&n3);
Node=Tree[n1]; //Node等于树中n1位置的指针
if(Node->data==n1); //判断n1节点是否已经存在(如果在Tree[n1].data这个值为空,那么就证明这个节点不存在),存在才可以建立左右子树。
{
if(n2!=0)
{
Node->lchild=(BiTNode*)malloc(sizeof(BiTNode));//为当前节点的左子树申请空间
Node->lchild->data=n2; //**
Tree[n2]=Node->lchild; //Tree[n2]这个数组位置的值是当前Node的左子节点
}
else
{
Node->lchild=NULL;
}
if(n3!=0)
{
Node->rchild=(BiTNode*)malloc(sizeof(BiTNode));//为当前节点的右子树申请空间
Node->rchild->data=n3; //**
Tree[n3]=Node->rchild; //Tree[n3]这个数组位置的值是当前Node的右子节点
}
else
{
Node->rchild=NULL;
}
}
}
}
/* 1
/ \
2 3
/ \ / \
4 5 6 7
/
8
*/
//找公共祖先
BiTNode *GetlowestAncestor(BiTree T,int n1,int n2)
{
if(T==NULL||n1==T->data||n2==T->data) //如果当前节点是空,证明当前分支的最后一个节点
{ //如果n1或者n2等于当前节点的值,那么这条分支找到n1了,不用再继续延伸了。
return T;
}
BiTNode *left=GetlowestAncestor(T->lchild,n1,n2); //从当前节点向左分支找节点n1,n2。
BiTNode *right=GetlowestAncestor(T->rchild,n1,n2); //从当前节点向右分支找节点n1,n2。
if(right!=NULL&&left!=NULL) //如果当前节点的左右子节点都不是空,那么此节点就是公共祖先
{
return T;
}
else
{
return left !=NULL ?left:right; //如果不存在左子节点为空,返回右子节点,如果右子节点是空,返回NULL
//如果左子节点是不是空,返回左子节点
}
}
int main()
{
int N,root;
int n1,n2;
scanf("%d %d",&N,&root);
BiTNode *T;
T=(BiTNode*)malloc(sizeof(BiTNode));
T->data=root; //**
T->lchild=NULL;
T->rchild=NULL;
CreateBiTree(T,N,root);
scanf("%d %d",&n1,&n2);
BiTNode *Ancestor=GetlowestAncestor(T,n1,n2); //**
printf("%d",Ancestor->data);
return 0;
}
NowCoder——查找二叉树中任意两个节点的最近公共祖先
最新推荐文章于 2023-09-10 20:49:11 发布